Hibernate——离线条件检索DetachedCriteria
DetachedCriteria翻译为离线条件查询,因为它是可以脱离Session来使用的一种条件查询对象,我们都知道Criteria对象吧必须由Session
对象来创建。那么就是说必须先有Session才可以生成Criteria对象。而DetachedCriteria对象可以在其他层对条件进行封装。
这个对象也是比较有用的,尤其在SSH整合以后这个对象会经常使用。它的主要优点是做一些特别复杂的条件查询的时候,
往往会在WEB层向业务层传递很多的参数,业务层又会将这些参数传递给DAO层。最后在DAO中拼接SQL完成查询。有了离线条件查询对象后,
那么这些工作都可以不用关心了,我们可以在WEB层将数据封装好,传递到业务层,再由业务层传递给DAO完成查询。
简单的说就是:封装条件的对象criteria,必须现有session,而session是在DAO生成的,那么就意味着,web层到service层再到DAO层,中间传递的都是条件字符串,然后再对应封装条件。这样很麻烦,不如在web层开始就把条件封装好,然后传递条件就是了,最后到了DAO层让这个条件对象绑定当前session就OK。这就是离线条件查询,DetachedCriteria。
/**
* 离线条件检索Demo
*/
@Test
public void fun(){
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Employee.class);
detachedCriteria.add(Restrictions.idEq(1002127));
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
//离线条件查询对象与session对象绑定
List<Employee> employees = detachedCriteria.getExecutableCriteria(session).list();
for(Employee emp : employees){
System.out.println(emp);
}
tx.commit();
session.close();
}
Hibernate:
select
this_.eid as eid1_2_0_,
this_.ename as ename2_2_0_,
this_.egender as egender3_2_0_,
this_.ephone as ephone4_2_0_
from
employee this_
where
this_.eid = ?
Hibernate:
select
roles0_.r_eid as r_eid2_1_0_,
roles0_.r_rtype as r_rtype1_1_0_,
role1_.rtype as rtype1_4_1_,
role1_.rname as rname2_4_1_
from
emp_role roles0_
inner join
role role1_
on roles0_.r_rtype=role1_.rtype
where
roles0_.r_eid=?
Employee [eid=1002127, ename=刘欢, egender=男, ephone=15497863155, roles=[deep.domain.Role@70925b45, deep.domain.Role@3deb2326]]