何时使用Hibernate投影?

时间:2011-09-21 10:23:33

标签: hibernate hibernate-criteria nhibernate-projections

我对Hibernate的投影标准感到有些困惑。何时使用预测以及何时使用标准?

请帮帮我。 谢谢!

4 个答案:

答案 0 :(得分:80)

它们不是互斥的,你可以同时使用它们。预测通常用于某些标准的背景下。

简单来说,Hibernate Projections用于仅查询您使用Criteria查询的实体或实体组的属性的子集。您还可以使用预测指定distinct子句和汇总函数,例如maxsum等。这就像是指你正在提取的哪个数据。就像修改SQL查询中的select子句一样。

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

请注意,如何 并非严格属实,它只是一个旨在帮助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类

原始表 -

enter image description here

答案 2 :(得分:1)

休眠预测对于

非常有用

1)仅获取表的某些列

2)执行聚合,例如计数,总和,最大值,最小值,平均值。

仅获取需要的列提高查询的性能

投影示例

Projections using DTO

Projection List example

答案 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();