Hibernate入门(十二)离线条件检索

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]]

 

posted @ 2018-11-24 15:04  程序员deepz  阅读(345)  评论(0编辑  收藏  举报