我有一个实体,比如说
@Entity
public class Category {
private String name;
private int usersInCategory;
}
我想用一些聚合SQL查询(select count(*) ... group by ...
)填充usersInCategory字段。
如何在Hibernate中执行此操作?
答案 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实体字段的初始任务不会以这种方式完成,但是当您不需要始终拥有该字段时,这将更有效。