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

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

【问题讨论】:

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

标签: hibernate hibernate-criteria nhibernate-projections


【解决方案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

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多