【发布时间】:2014-02-17 23:14:18
【问题描述】:
我试图用一对多关系求和,如下关系所示(仅显示父级):
@Entity
@Table(name = "Parent")
public class Parent implements Serializable {
private static final long serialVersionUID = -7348332185233715983L;
@Id
@Basic(optional = false)
@Column(name = "PARENT_ID")
private Long parentId;
@OneToMany
@JoinColumn(name="CHILDREN", referencedColumnName="PARENT_ID")
private List<Child> children;
@Formula("(select sum(select height from children))")
private BicDecimal totalHeight
}
它非常简单,没有任何限制,甚至有静态限制。但是,当子列表受到动态限制时,我遇到了麻烦。
就我而言,我使用的是 spring data 和 jpa。我正在使用规范来限制孩子并获得适当的孩子列表,但显然总和仍然适用于不受限制的孩子,因为@Formula 标记中没有 where 子句。
出于性能原因和结果是分页的,我不想在 java 中遍历列表。此外,总和不是分页结果的总和,而是所有结果的总和。
我是 Spring Data/JPA 的新手。从历史上看,我可以动态构建此查询或使用休眠条件。我可以运行一个完整的单独查询来进行此计算。我不需要使用 @Formula 注释,因为每次调用只有 1 个聚合。在休眠框架中,我可以将 select 子句声明为“sum(field)”并构建标准。在 Spring Data/JPA 框架中,我可以构建涵盖标准的规范,但我不知道如何操作查询的选择部分,因为它似乎与实体紧密相关。
如果我知道我需要限制哪些字段,则在存储库上使用 @Query 注释可以作为自己的查询,但通常这些字段为空并且需要在查询中忽略。有 8 个可能的字段,给我留下了 256 种可能的组合 (2^8)。存储库中的方法太多了。
在切换框架之外有什么想法吗?
【问题讨论】:
标签: spring jpa sum spring-data-jpa aggregation