我对Hibernate的投影和标准感到有些困惑。何时使用预测以及何时使用标准?
请帮帮我。 谢谢!
答案 0 :(得分:80)
它们不是互斥的,你可以同时使用它们。预测通常用于某些标准的背景下。
简单来说,Hibernate Projections用于仅查询您使用Criteria查询的实体或实体组的属性的子集。您还可以使用预测指定distinct
子句和汇总函数,例如max
,sum
等。这就像是指你正在提取的哪个数据。就像修改SQL查询中的select
子句一样。
Hibernate Criteria用于定义数据必须满足的条件才能被选中。这就像是指 是您要获取的数据。就像修改SQL查询的from
和where
子句一样。
请注意,如何和 并非严格属实,它只是一个旨在帮助OP的方向。您可以更改使用createCriteria(String associationPath)
获取的数据。
我建议您查看一下这篇文章Hibernate: Criteria Queries in Depth
答案 1 :(得分:1)
预测用于执行汇总操作并获得单列查询,限制我们可以访问 ROW 但是使用PROJECTIONS我们可以访问整个 COLUMN
EX -
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();
}
}
在上面的例子中,我使用了投影调用来向标准添加投影属性“name”。它返回温彻斯特温彻斯特温彻斯特温彻斯特,这是表中的lastName COLUMN 。
输出=
Hibernate:从学生this_中选择this_.last_name为y0_ 温彻斯特 温彻斯特 温彻斯特 温彻斯特
注意 - 我们只能添加一个投影,如果我们添加超过1个投影,则前一个投影将被覆盖。如果您想添加多个投影,您将需要ProjectionList类
原始表 -
答案 2 :(得分:1)
休眠预测对于
非常有用1)仅获取表的某些列
2)执行聚合,例如计数,总和,最大值,最小值,平均值。
仅获取需要的列提高查询的性能。
投影示例
答案 3 :(得分:-1)
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 -----
}
如果我们向条件添加多个投影,那么添加的最后一个投影将被视为执行,请参阅...
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();