标准 当只需要实体的一部分时,添加实体 class 中的所有表
Criteria Add all the tables from the entity class when it only needs part of it
当我使用 hibernate 创建计数查询时 - 条件 - 添加实体 class 中所有可能的 table 作为左连接,性能不佳。
实体:
@Entity
@Table(name = "employees")
Public Class Employees {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "lz_job_stat_id")
private Integer id;
@ManyToOne
@JoinColumn(name = "departments_id")
private Departments departments;
@ManyToOne
@JoinColumn(name = "managers_id")
private Managers managers;
}
标准:
public class EmployeeDao {
public List<EmpDao> findIt(){
.....
Criteria crit = createEntityCriteria().setFetchMode("departments", FetchMode.SELECT);
crit.add(Restrictions.eq("managers.deleted", false));
crit.setProjection(Projections.count("id"));
return crit.list();
}
}
并生成 SQL :
select count() as y0_
from employees this_
left outer join departments department3_
on this_.department_id=department3_.department_id
left outer join managers manager2_
on this_.manager_id=manager2_.manager_id
现在,当我尝试 crit.list - 它为所有可能的 table 创建一个左连接。
当它不应该为所有这些创建连接时。
难道 Criteria 不够聪明,知道我不需要这个 tables 吗?只有我用的 "WHERE CLAUSE"
有没有办法明确告诉 Criteria "DO NOT JOIN THIS TABLES !!!"
没有 SQL
在 ManyToOne
注释上指定提取类型:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "departments_id")
private Departments departments;
或恕我直言,在标准中更可取:
criteria.setFetchMode("departments", FetchMode.SELECT)
当我使用 hibernate 创建计数查询时 - 条件 - 添加实体 class 中所有可能的 table 作为左连接,性能不佳。
实体:
@Entity
@Table(name = "employees")
Public Class Employees {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "lz_job_stat_id")
private Integer id;
@ManyToOne
@JoinColumn(name = "departments_id")
private Departments departments;
@ManyToOne
@JoinColumn(name = "managers_id")
private Managers managers;
}
标准:
public class EmployeeDao {
public List<EmpDao> findIt(){
.....
Criteria crit = createEntityCriteria().setFetchMode("departments", FetchMode.SELECT);
crit.add(Restrictions.eq("managers.deleted", false));
crit.setProjection(Projections.count("id"));
return crit.list();
}
}
并生成 SQL :
select count() as y0_
from employees this_
left outer join departments department3_
on this_.department_id=department3_.department_id
left outer join managers manager2_
on this_.manager_id=manager2_.manager_id
现在,当我尝试 crit.list - 它为所有可能的 table 创建一个左连接。
当它不应该为所有这些创建连接时。
难道 Criteria 不够聪明,知道我不需要这个 tables 吗?只有我用的 "WHERE CLAUSE"
有没有办法明确告诉 Criteria "DO NOT JOIN THIS TABLES !!!"
没有 SQL
在 ManyToOne
注释上指定提取类型:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "departments_id")
private Departments departments;
或恕我直言,在标准中更可取:
criteria.setFetchMode("departments", FetchMode.SELECT)