何时使用Hibernate投影?

50

我对Hibernate的投影条件查询有些困惑。什么时候应该使用投影,什么时候应该使用条件查询?


1
将投影想象成您想在投影仪上呈现的列/摘要(因此涉及关键字如“min”/“max”/“avg”/“sum”/“count”/等等...)// 将标准想象成原始数据(行)的子集,可能是为了确认投影是否正确(因此涉及关键字如“where”/“and”/等等...)。// 您的经理:您是如何得出这个投影的? 您:这是标准,老板。 - jumping_monkey
4个回答

96

它们不是相互排斥的,你可以同时使用两者。投影通常用于一些条件的上下文中。

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

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

请注意,这里的“如何”和“哪些”并不严格正确,只是为了帮助提问者更好地理解。例如,您可以使用 createCriteria(String associationPath) 更改要获取的数据。

我建议您查看这篇文章:《深入了解 Hibernate Criteria 查询》


3
count()函数的作用是返回符合特定条件的结果数量,对于这段代码而言,它的意思是返回符合"Book"实体类的所有记录数量。具体实现是通过Hibernate框架中的session.createCriteria("Book")方法获取到对应的查询对象,再调用setProjection(Projections.rowCount())将查询结果限制为记录数量,并最终调用uniqueResult()方法返回唯一结果,这个结果就是记录数量。最终返回的类型是Number类型。 - Jorge Nunez Newton
1
说得好,谢谢!我很感激将其与SQL进行比较。对我来说,这帮助我更好地理解,因为我在那方面有一些背景知识。 - Josh

6
投影用于执行聚合操作并获取单列查询,使用限制可以访问,但使用投影可以访问整个
例如 -
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"到条件中。它返回winchester winchester winchester winchester,这是表中的lastName列。
输出=
Hibernate: select this_.last_name as y0_ from student this_ winchester winchester winchester winchester 注意-我们只能添加一个投影,如果添加多个投影,前一个将被覆盖。如果你想添加多个投影,你需要ProjectionList类。
原始表-

enter image description here


1
Hibernate的投影是有用的,可以:

1)仅获取表中某些列

2)执行聚合操作,如计数、求和、最大值、最小值、平均值。

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

投影的示例

使用DTO进行投影

投影列表示例


-1

Projection是“org.hibernate.criterion”包中提供的一个接口,Projections是同一包中提供的一个类,实际上Projection是一个接口,而Projections是一个工厂类,用于生成投影对象。

在Projections类中,我们有所有静态方法,该类的每个方法都返回Projection接口对象。

如果我们想要将Projection对象添加到Criteria中,则需要调用setProjection()方法。

请记住,在向criteria添加投影对象时,每次只能添加一个对象。这意味着如果我们添加第二个投影对象,则第二个对象将覆盖第一个对象(第一个对象将不起作用),因此我们一次只能向criteria对象添加一个投影对象。

使用criteria,如果我们想要从数据库加载部分对象,则需要为要从数据库加载的属性创建投影对象。

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

5
这个回答如何回答这个问题? - Stephen Isienyi
4
Hibernate中使用Criteria进行投影操作 - John Henckel
Projection类没有property方法。 - Lluis Martinez
必须使用Projections而不是Projection。注意末尾的's'。 - Merv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接