Hibernate DetachedQuery和Spring的HibernateTemplate with Restriction给出了错误的结果

时间:2015-03-13 02:38:48

标签: java spring hibernate orm criteria

我的数据结构是这样的

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'应用限制;

我做错了什么?有什么建议?怎么解决这个?

抱歉,查询可能不完全正确,但您明白了。 需要更多细节请问,我可以提供。

提前致谢..

2 个答案:

答案 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