何时使用 Hibernate 投影?

Posted

技术标签:

【中文标题】何时使用 Hibernate 投影?【英文标题】:When to use Hibernate projections? 【发布时间】:2011-11-21 19:54:13 【问题描述】:

我对 Hibernate 的 projectionscriteria 有点困惑。何时使用预测以及何时使用标准?

【问题讨论】:

想想你想在投影仪上展示的列/摘要之类的投影(所以像min/max/avg/sum/count/etc.. . 进入图片)// 将标准想象为原始数据(行)的子集,可能是为了确认投影是正确的(所以像 where/and/etc 这样的关键字出现在图片中。/ / 你的经理:你是怎么得出这个预测的?你:这是老板的标准。 【参考方案1】:

它们不是相互排斥的,您可以同时使用它们。投影通常用于某些标准的上下文中。

简单地说,Hibernate Projections 用于仅查询您使用 Criteria 查询的实体或实体组的属性子集。您还可以使用 Projections 指定 distinct 子句和聚合函数,如 maxsum 等。这就像引用您要获取的哪些数据。就像在 SQL 查询中修改 select 子句一样。

Hibernate Criteria 用于定义数据必须满足才能被选中的条件。这就像指的是如何是您正在获取的数据。就像修改 SQL 查询的 fromwhere 子句一样。

请注意,这 howwhich 并不完全正确,它只是一个旨在帮助 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出错了,求帮忙解决,如下

Hibernae

Hibernaate 详解

Hibernate Projections(投影统计不重复结果)

Hibernate genericDao 投影

在基于方言的 Hibernate 标准 API 中使用不同的投影函数