我的数据结构是这样的
Department
-> Employees
-> Gender
-> CityID -> Cities
->CityID
->CountryID -> Countries
-> CountryID
系类:
public class Department {
@OneToMany(mappedBy = "departmentid", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Employee> employees = new HashSet<>();
}
我像这样建立Crteria:
DetachedCriteria criteria = DetachedCriteria.forClass(Department.class);
DetachedCriteria detlCrit = criteria.createCriteria("employees");
detlCrit.add(Restrictions.eq("gender", "MALE"));
detlCrit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
我有1个部门,2个员工在表中(1名男性,1名女性)。 当我超出此标准时,我希望Hibernate构建一个“部门” 对象,一个“员工”对象,一个城市,国家等,
但我得到的是1个部门,2个员工。
当我在日志中看到Hibernate执行的查询时,它会显示两个查询 第一个查询:
Select * from Department, Employee
Left outer join City on Employee.cityID = City.cityID
Left outer join Country on City.countryID = City.countryID
Where Employee.DeptID = Department.DeptID
AND Employee.Gender = 'MALE';
第二次查询:
Select * from Employee
Left outer join City on Employee.cityID = City.cityID
Left outer join Country on City.countryID = City.countryID
Where Employee.DeptID = Department.DeptID;
第二个查询错误,没有对Gender ='MALE'应用限制;
我做错了什么?有什么建议?怎么解决这个?
抱歉,查询可能不完全正确,但您明白了。 需要更多细节请问,我可以提供。
提前致谢..
答案 0 :(得分:1)
尝试使用SessionFactory。
@Autowired
private SessionFactory sessionFactory;
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Department.class);
criteria.add(Restrictions.eq("gender", "MALE"));
希望我有用。
答案 1 :(得分:1)
第一个查询是选择Department
个实体,并按照您在where子句中指定的方式应用过滤。
但是你不能截断关联,你总是要急切地或懒洋洋地抓取它们。这是因为Hibernate必须在flushing back加载的部门实体和可能cascading员工陈述回数据库时保持一致性保证。
第二个查询很可能是因为您在员工集合中使用了FetchType.EAGER:
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "department", orphanRemoval = true)
private List<Employee> employees = new ArrayList<>();
获取部门后,也会急切地获取员工集合。
尝试使用HQL查询,例如:
select distinct d
from Department d
left join fetch d.employees e
where e.gender = :gender