何时使用 Hibernate 投影?
Posted
技术标签:
【中文标题】何时使用 Hibernate 投影?【英文标题】:When to use Hibernate projections? 【发布时间】:2011-11-21 19:54:13 【问题描述】:我对 Hibernate 的 projections 和 criteria 有点困惑。何时使用预测以及何时使用标准?
【问题讨论】:
想想你想在投影仪上展示的列/摘要之类的投影(所以像min
/max
/avg
/sum
/count
/etc.. . 进入图片)// 将标准想象为原始数据(行)的子集,可能是为了确认投影是正确的(所以像 where
/and
/etc 这样的关键字出现在图片中。/ / 你的经理:你是怎么得出这个预测的?你:这是老板的标准。
【参考方案1】:
它们不是相互排斥的,您可以同时使用它们。投影通常用于某些标准的上下文中。
简单地说,Hibernate Projections 用于仅查询您使用 Criteria 查询的实体或实体组的属性子集。您还可以使用 Projections 指定 distinct
子句和聚合函数,如 max
、sum
等。这就像引用您要获取的哪些数据。就像在 SQL 查询中修改 select
子句一样。
Hibernate Criteria 用于定义数据必须满足才能被选中的条件。这就像指的是如何是您正在获取的数据。就像修改 SQL 查询的 from
和 where
子句一样。
请注意,这 how 和 which 并不完全正确,它只是一个旨在帮助 OP 的方向。例如,您可以使用createCriteria(String associationPath)
更改要获取的哪些 数据。
我建议看看这篇文章Hibernate: Criteria Queries in Depth
【讨论】:
而且有用的是count() as -> return (Number) session.createCriteria("Book").setProjection(Projections.rowCount()).uniqueResult();【参考方案2】: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();
【讨论】:
这如何回答这个问题? 链接到原始java4s.com/hibernate/… 投影类没有属性方法。 必须是投影而不是投影。注意末尾的“s”【参考方案3】: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_ 中选择 this_.last_name 作为 y0_ 温彻斯特 温彻斯特 温彻斯特 温彻斯特
注意 - 我们只能添加一个投影,如果我们添加超过 1 个投影,前一个将被覆盖。如果您想添加多个投影,您将需要 ProjectionList 类
原始表 -
【讨论】:
【参考方案4】:Hibernate 投影对
很有用1)仅获取表的某些列
2) 执行 count、sum、max、min、avg 等聚合。
仅获取需要的列提高了查询的性能。
投影示例
Projections using DTO
Projection List example
【讨论】:
以上是关于何时使用 Hibernate 投影?的主要内容,如果未能解决你的问题,请参考以下文章
求教第一个hibernae程序的配置文件hibernate.cfg.xml出错了,求帮忙解决,如下