如何在Hibernate中用单独的队列填充实体的字段?

时间:2010-08-08 18:33:51

标签: java hibernate orm jpa

我有一个实体,比如说

@Entity
public class Category {

  private String name;

  private int usersInCategory;
}

我想用一些聚合SQL查询(select count(*) ... group by ...)填充usersInCategory字段。

如何在Hibernate中执行此操作?

2 个答案:

答案 0 :(得分:2)

使用Formula(这是一个特定于Hibernate的注释)。来自文档:

  

2.4.3.1. Formula

     

有时,您希望数据库执行此操作   一些计算对你而不是   在JVM中,您可能还会创建一些   一种虚拟列。你可以使用   SQL片段(又名公式)代替   将属性映射到列。这个   一种财产是只读的(它的   值由您的公式计算   片段)。

@Formula("obj_length * obj_height * obj_width")
public long getObjectVolume()
     

SQL片段可以像复杂一样复杂   你想要甚至包括子选择。

正如文档所写,SQL片段可能非常复杂,并且可以引用拥有的实体,如下例所示(where子句的id部分中的非别名o.customer_id=id列引用了拥有实体专栏):

@Formula("(select coalesce(extract ('day' from age(max(o.creation_date))), 9999) from Orders o where o.customer_id = id)")
private int daysSinceLastOrder;

另见

答案 1 :(得分:0)

另一种已经想到这样做的方法是跟踪查询后退:

select c, (select count(i) from Item i where c = i.category) from Category c

这将生成元组列表(Categroy,items_count)。 init实体字段的初始任务不会以这种方式完成,但是当您不需要始终拥有该字段时,这将更有效。