我对 Hibernate 的预测和标准有点困惑。何时使用预测以及何时使用标准?
4 回答
它们不是相互排斥的,您可以同时使用它们。投影通常用于某些标准的上下文中。
简单地说,Hibernate Projections 用于仅查询您使用 Criteria 查询的实体或实体组的属性子集。您还可以使用 Projections 来指定distinct
子句和聚合函数max
,例如sum
等。这就像指的是您要获取的数据。select
就像在 SQL 查询中修改子句一样。
Hibernate Criteria 用于定义数据必须满足才能被选择的条件。这就像指的是您正在获取的数据如何。就像修改 SQL 查询的from
andwhere
子句一样。
请注意,这种方式和方式并非严格正确,这只是旨在帮助 OP 的方向。例如,您可以更改要获取的数据createCriteria(String associationPath)
。
我建议看看这篇文章Hibernate: Criteria Queries in Depth
Projections 用于执行聚合操作并获得单列查询,使用 Restrictions 我们可以访问ROW但使用 PROJECTIONS 我们可以访问整个COLUMN
前任 -
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();
}
}
在上面的示例中,我使用投影调用将投影属性“名称”添加到标准中。它返回 winchester winchester winchester winchester ,它是表中的 lastName COLUMN。
输出 =
休眠:从学生 this_winchester winchester 中选择 this_.last_name 作为 y0_
注意 -我们只能添加一个投影,如果我们添加超过 1 个投影,前一个将被覆盖。如果你想添加多个投影,你需要使用 ProjectionList 类
原始表 -
Projection是“org.hibernate.criterion”包中给出的一个接口,Projections是同一个包中给出的一个类,实际上Projection是一个接口,Projections是一个类,是一个生产投影对象的工厂。
在 Projections 类中,我们有所有的静态方法,并且这个类的每个方法都返回 Projection 接口对象。
如果我们想向 Criteria 添加一个 Projection 对象,那么我们需要调用一个方法 setProjection()
请记住,在将投影对象添加到标准时,可以一次添加一个对象。这意味着如果我们添加第二个投影对象,那么第二个将覆盖第一个(第一个不会工作),所以一次我们只能将一个投影对象添加到标准对象
使用标准,如果我们想从数据库加载部分对象,那么我们需要为要从数据库加载的属性创建一个投影对象
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 -----
}
如果我们向标准添加多个投影,那么最后添加的投影将被视为执行查看...</p>
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();