【问题标题】:Entity field representing a count with conditions表示带有条件的计数的实体字段
【发布时间】:2015-07-15 14:55:55
【问题描述】:

我有一个@Entity Location,它有一个字段:

  • Set<Alert> openAlerts

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

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

目前在Location我有:

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

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

我想用Integer numberOpenAlerts 替换该字段。 这个新字段应该只检索和计数链接到具有AlertStateOPEN 的位置的警报。

我该怎么做?

【问题讨论】:

    标签: hibernate jpa count


    【解决方案1】:

    我可以从以下几种可能性入手。

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

    @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 查询,该查询使用适当的位置字段和打开的警报计数执行 Constructor Select query。示例见this question and answer

    【讨论】:

    • 我认为最后一个解决方案可以做到。感谢您的提示
    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多