何时在hibernate中使用分离标准?

use*_*403 19 hibernate

何时使用分离标准?我们通过使用分离标准而不是正常标准获得的优势是什么?

Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Some.class);


DetachedCriteria criteria = DetachedCriteria.forClass(Some.class);
Run Code Online (Sandbox Code Playgroud)

谢谢!

use*_*692 16

按照文档

某些应用程序需要在"分离模式"下创建条件查询,其中Hibernate会话不可用.可以在任何地方实例化该类,然后通过将会话传递给可以获得Criteria getExecutableCriteria().所有方法都具有与Criteria接口的相应方法相同的语义和行为.

  • 从[docs](https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/criterion/DetachedCriteria.html)中窃取. (3认同)

Jag*_*esh 10

'与会话对象

分离' 分离标准可以在两种情况下使用:

  1. 构建没有会话对象的条件查询:
    会话仅在执行查询/向数据库提交查询期间需要,而不是在构建查询时.

    例如:

        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
        detachedCriteria.add(Restrictions.eq("DEPTID", 1));
        ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.property("DEPTID"));
        detachedCriteria.setProjection(projectionList);
    
       //Add more
        .............................
    
    Run Code Online (Sandbox Code Playgroud)

    在上面的代码中,您是否发现有必要使用会话对象来构建此类条件查询?绝对没有.

  2. 多次构建相同的条件查询:
    无论会话对象如何,都可以构建一次,并且可以随时随地使用.

最后,当会话对象可用时,使用上面的会话查询,如下所示:

detachedCriteria.getExecutableCriteria(session).list();
Run Code Online (Sandbox Code Playgroud)