gpt4 book ai didi

spring - 与一对多 Spring Data JPA 相加

转载 作者:行者123 更新时间:2023-12-04 13:49:49 29 4
gpt4 key购买 nike

我试图通过以下关系(仅显示父级)来说明一对多关系的总和:

@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 数据和 jpa。我正在使用规范来限制子项并获得适当的子项列表,但显然总和仍然适用于不受限制的子项,因为 @Formula 标记中没有 where 子句。

出于性能原因和结果是分页的,我不想在 java 中迭代列表。此外,总和不是分页结果的总和,而是所有结果的总和。

我是 Spring Data/JPA 的新手。从历史上看,我可以动态构建此查询或使用休眠条件。我可以运行一个完全独立的查询来进行这个计算。我不需要使用 @Formula 注释,因为每次调用只有 1 个聚合。在休眠框架中,我可以将 select 子句声明为“sum(field)”并构建标准。在 Spring Data/JPA 框架中,我可以构建涵盖标准的规范,但我不知道如何操作查询的 select 部分,因为它似乎与实体紧密相关。

如果我知道需要限制哪些字段,则在存储库上使用 @Query 注释可以作为它自己的查询,但这些字段通常为空并且需要在查询中被忽略。有 8 个可能的字段,给我留下了 256 个可能的组合 (2^8)。存储库中的方法太多了。

切换框架之外的任何想法?

最佳答案

发布这个老问题的答案,因为我最近遇到了类似的问题。

我决定使用一个自定义存储库,该存储库使用一种根据传入的任何规范进行聚合的方法。规范可以组合以组成动态标准(参见 org.springframework.data.jpa.domain.Specifications)

因此,我的存储库高于 Child 高度问题如下所示:

package something

import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

@Repository
public class ChildHeightRepository {

@PersistenceContext
EntityManager entityManager;


public Long getTotalHeight(Specification<Child> spec) {

CriteriaBuilder cb = entityManager.getCriteriaBuilder();

CriteriaQuery query = cb.createQuery(Long.class);

Root root = query.from(Child.class);

return ((Long) entityManager.createQuery(
query.where(spec.toPredicate(root, query, cb))
.select(cb.sum(root.get("height")))).getSingleResult());


}
}

关于spring - 与一对多 Spring Data JPA 相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21841201/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com