45

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

4

4 回答 4

91

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

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

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

请注意,这种方式方式并非严格正确,这只是旨在帮助 OP 的方向。例如,您可以更改要获取的数据createCriteria(String associationPath)

我建议看看这篇文章Hibernate: Criteria Queries in Depth

于 2011-09-21T10:33:09.177 回答
5

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 类

原始表 -

在此处输入图像描述

于 2018-02-10T07:47:41.113 回答
1

Hibernate 投影对于

1)仅获取表的某些列

2) 执行计数、总和、最大值、最小值、平均值等聚合。

仅获取所需的列可以提高查询的性能。

投影示例

使用 DTO 的投影

投影列表示例

于 2020-01-06T05:32:00.017 回答
-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 -----
}

如果我们向标准添加多个投影,那么最后添加的投影将被视为执行查看...</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();
于 2013-11-22T12:25:29.933 回答