hibernate中标准和分离标准之间的区别?

时间:2011-10-17 13:54:42

标签: hibernate

标准和分离标准之间有什么区别?我们什么时候应该寻求标准?什么时候应该采用超然标准?

4 个答案:

答案 0 :(得分:32)

detached criteria允许您创建不带Session的查询。然后,您可以在任意会话中执行搜索。

事实上,当使用detached criteria使用另一个或新的会话(没有缓存,并创建会话)时,您应该仔细考虑。

它们对于连接条件,子选择以及在当前会话外查询非常有用。

另一个常见用途是代码重用。许多开发人员将它们声明为static个查询,并使用来自不同DAO的基础会话执行它们。

答案 1 :(得分:10)

使用DetachedCriteria与Criteria完全相同,除了您可以在不访问会话的情况下进行查询的初始创建和设置。在运行查询时,必须将其转换为getExecutableCriteria(session)的可执行查询。

如果您正在构建复杂的查询(可能是通过多步骤过程),这非常有用,因为您无需在任何地方访问会话。运行查询时,最后一步只需要Session。

在引擎盖下,DetachedCriteria使用CriteriaImpl,它与您调用session.createCriteria()时获得的类相同。

答案 2 :(得分:4)

- 当hibernate会话不存在时,离线条件非常好。

- 标准在线,这意味着它使用Session类对象。但是分离的条件是离线的,因为它不需要会话

- 然后分离标准允许代码重用。

public static void main(String [] args) throws Exception {
    AnnotationConfiguration cfg = new AnnotationConfiguration();
    cfg.configure("hibernate.cfg.xml");
    SessionFactory factory = cfg.buildSessionFactory();
    Session session = factory.openSession();

    System.out.println("By using criteria");

    Criteria cr=session.createCriteria(Student.class);
    cr.add(Restrictions.eq("gender", "male"));
    cr.addOrder(Order.asc("stud_id"));
    List<Student> res=((Criteria) cr).list();
    for(int i=0;i<res.size();i++)
    {
        System.out.print( res.get(i).getStud_id()+"\t");
        System.out.println(res.get(i).getName());
    }

    System.out.println("\n\nBy using Detached criteria");
    DetachedCriteria dcr = DetachedCriteria.forClass(Student.class).add(Property.forName("gender").eq("male"));
    dcr.addOrder(Order.desc("stud_id"));
    List<Student> results = dcr.getExecutableCriteria(session).list();
    for(int i=0;i<results.size();i++)
    {
        System.out.print( results.get(i).getStud_id()+"\t");
        System.out.println(results.get(i).getName());
    }

Click here了解实施说明。

答案 3 :(得分:3)

只是作为提醒。 如果您使用的是Spring并选择使用HibernateTemplate,则它不提供createCriteria()方法。

您只能找到DetachedCriteria。

另见:

HibernateTemplate javadoc