我对Hibernate的投影和条件查询有些困惑。什么时候应该使用投影,什么时候应该使用条件查询?
我对Hibernate的投影和条件查询有些困惑。什么时候应该使用投影,什么时候应该使用条件查询?
它们不是相互排斥的,你可以同时使用两者。投影通常用于一些条件的上下文中。
简单来说,Hibernate Projections 用于仅查询您使用 Criteria 查询的实体或一组实体的某个属性子集。您还可以使用 Projections 指定 distinct
子句和聚合函数,如 max
、sum
等。这就像指定要获取哪些数据,类似于修改 SQL 查询中的 select
子句。
Hibernate Criteria 用于定义数据必须满足的条件才能被选择。这就像指定您要获取哪些数据,类似于修改 SQL 查询中的 from
和 where
子句。
请注意,这里的“如何”和“哪些”并不严格正确,只是为了帮助提问者更好地理解。例如,您可以使用 createCriteria(String associationPath)
更改要获取的数据。
我建议您查看这篇文章:《深入了解 Hibernate Criteria 查询》
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure().addAnnotatedClass(Student.class).buildSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
Criteria c = session.createCriteria(Student.class);
Projection p = Projections.property("lastName");
List<String> students = c.setProjection(p).list();
for(String s:students)
System.out.println(s);
session.getTransaction().commit();
session.close();
} finally {
factory.close();
}
}
Projection是“org.hibernate.criterion”包中提供的一个接口,Projections是同一包中提供的一个类,实际上Projection是一个接口,而Projections是一个工厂类,用于生成投影对象。
在Projections类中,我们有所有静态方法,该类的每个方法都返回Projection接口对象。
如果我们想要将Projection对象添加到Criteria中,则需要调用setProjection()方法。
请记住,在向criteria添加投影对象时,每次只能添加一个对象。这意味着如果我们添加第二个投影对象,则第二个对象将覆盖第一个对象(第一个对象将不起作用),因此我们一次只能向criteria对象添加一个投影对象。
使用criteria,如果我们想要从数据库加载部分对象,则需要为要从数据库加载的属性创建投影对象。
Criteria crit = session.createCriteria(Products.class);
crit.setProjection(Projections.proparty("proName"));
List l=crit.list();
Iterator it=l.iterator();
while(it.hasNext())
{
String s = (String)it.next();
// ---- print -----
}
Criteria crit = session.createCriteria(Products.class);
Projection p1 = Projection.property("proName");
Projection p2 = Projection.property("price");
crit.setProjection(p1):
crit.setProjection(p2):
List l=crit.list();