在hibernate中标准和分离标准之间的差异?

use*_*904 41 hibernate

请告诉我标准和超然评论之间的区别.我们何时应该考虑标准,何时应该采用超然标准?请指教我!

谢谢!

sse*_*ano 34

该分离的标准允许你创建无查询Session.然后,您可以在任意会话中执行搜索.

实际上,在使用detached criteria另一个或新的会话时(无缓存和会话的创建),您应该仔细考虑.

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

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

  • 这个答案是错误的... DetachedCriterias 的行为与 Criterias 完全相同,只是您可以在不访问会话的情况下最初创建它们。 (2认同)
  • 我不明白 有什么缺点?为什么不每次都使用DetachedCriteria? (2认同)

tak*_*eek 11

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

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

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


Jit*_*air 5

-当休眠会话不存在时,分离标准是非常好的替代方案。

- 标准是在线的,这意味着它使用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());
    }
Run Code Online (Sandbox Code Playgroud)

单击此处获取实施说明。