【发布时间】:2023-02-09 22:38:28
【问题描述】:
我仍然是 JPA 初学者,想知道如何最好地使用 Spring 强大的功能来获取以下简单结构(默认情况下关联是惰性的,但我有一个用例,整个结构应该在没有代理的情况下加载,可能使用生成的 SQL 查询数量最少)。有关的简化实体:
@Entity
public class Bundle {
@Id
private Long id;
@OneToMany(mappedBy = "bundle", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Group> groups = new ArrayList<>();
}
...
@Entity
public class Group {
@Id
private Long id;
@ManyToOne()
@JoinColumn(name = "BUNDLE_ID")
private Bundle bundle;
@OneToMany(mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Element> elements = new ArrayList<>();
...
public class Element {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = "GROUP_ID")
private Group group;
}
我试图找到给定包下的所有组和元素(为了有效地处理它们并稍后在从端点返回之前转换为 DTO)是在 @Query 中获取
public interface BundleRepository extends JpaRepository<Bundle, Long> {
@Query("SELECT bundle FROM Bundle bundle "
+ "JOIN FETCH bundle.groups groups "
+ "JOIN FETCH groups.elements "
+ "WHERE bundle.id = :id")
Optional<Bundle> fetchBundle(@Param("id") long id);
}
但是,这会导致 org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags。我对这个主题做了一些阅读,发现将 Lists 更改为 Sets 可能会奏效,另一方面,一些消息来源不鼓励这样做。
这个双@OneToMany结构看起来很普通,多个JOINs也没有什么不寻常的,但无论如何我想请你指出正确的方法。也许分别为一个包获取组,然后为每个组获取其元素?这将是1 + 组数查询,是不是有点浪费?如果以这种方式将此视为一种权衡是朝着好的方向迈出的一步,请告诉我。
【问题讨论】:
标签: java spring spring-data-jpa spring-data