表示具有条件的计数的实体字段

时间:2015-07-15 14:55:56

标签: hibernate jpa count

我有@Entity Location,其中有一个字段:

  • Set<Alert> openAlerts

然后我有一个@Entity Alert,它有两个字段:

  • AlertState state这是一个枚举(可以是OPENCLOSED
  • Location originatedIn这是发出警报的位置。

目前Location我有:

@OneToMany(mappedBy = "originatedIn")
@JsonIgnoreProperties({"originatedIn"})
private Set<Alert> openAlerts;

它检索链接到该位置的所有警报(打开或关闭)。

我想用Integer numberOpenAlerts替换该字段。 此新字段应检索并统计与AlertState OPEN .xlsx位置相关联的提醒。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我可以想到一些可能性开始。

由于您使用的是Hibernate,因此可以使用@Where上的openAlerts注释来限制此设置为已打开的警报:

@OneToMany(mappedBy = "originatedIn")
@JsonIgnoreProperties({"originatedIn"})
@Where(clause="state='OPEN'")
private Set<Alert> openAlerts;

取决于state列实际包含的与OPEN枚举值相对应的内容。

有关指示,请参阅this question about @Where

或者,您可以创建一个数据库视图,其中包含位置详细信息和打开警报的计数。然后,您将创建与该视图对应的另一个实体,称为LocationWithOpenAlertCount

最后,您可以为Location plus count创建一个DTO,并创建一个JPQL查询,该查询使用适当的位置字段和打开的Alert计数执行Constructor Select query。有关示例,请参阅this question and answer