我正在尝试进行一对多关系的求和,在下面的关系中进行说明(仅显示父级):
@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。 我正在使用specifications来限制子项,并得到适当的子项列表,但显然,总和仍为未受限制的子项,因为@Formula标记中没有where子句。
出于性能原因,我不想在java中迭代列表,因为结果被分页。而且,总和并不是分页结果的总和,而是所有结果的总和。
我对Spring Data / JPA不熟悉。 以前,我可以动态构建此查询或使用hibernate标准。如果需要,在完全分开的查询中运行此计算是可以接受的。由于每次调用只有1个汇总,因此不必使用@Formula注释。 在Hibernate框架中,我只需将select子句设置为“sum(field)”并构建标准即可。 在Spring Data / JPA框架中,我可以很好地构建规范来覆盖标准,但我不知道如何操作查询的选择部分,因为它似乎与实体紧密绑定。
在存储库上使用@Query注释可以作为自己的查询,如果我知道需要对哪些字段进行限制,则有效,但通常需要忽略查询中的null字段。有8个可能的字段,使我有256个可能的组合(2 ^ 8)。 对于存储库中的此问题来说,方法太多了。
除了切换框架之外,有什么想法吗?