标准和分离标准之间有什么区别?我们什么时候应该寻求标准?什么时候应该采用超然标准?
答案 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。
另见: