spring - 多次在多对多关系加载实体上的实体图 - Spring Data JPA
问题描述
我的两个实体之间有@ManyToMany 关系。当我尝试将父母与他们的孩子一起加载时,父母会重复响应有效载荷。我想解决我的问题EntityGraphs
。
这是带有注释的父级。
@Entity
@Table(name="Parent_table")
@NamedEntityGraph(
name = "Parent.children",
attributeNodes = @NamedAttributeNode("children"))
public class Parent implements Serializable{
//some extra code
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
name="join table", joinColumns=@JoinColumn(name="key"),inverseJoinColumns=@JoinColumn(name="key"))
private List<Child> children;
这是父存储库中的代码。
@EntityGraph(value = "Parent.children", type = EntityGraphType.LOAD)
public List<Parent> findAll(Predicate predicate);
我的两个实体之间有多对多的关系。但我想得到像
parent1 {
child1,
child2
}
但是我为每个组合都得到了父母..
Parent1 {
child1,
child2
}
Parent1 {
child1,
child2
}
在那里我得到了parent2。
但我想要的是只获得一次 parent1 ,而不是重复。使用实体图时。
解决方案
如果使用实体图,Hibernate 会在查询中连接父表和子表。这会在结果集中创建一个产品,并且您会获得对其每个子实体的父实体的引用。
DISTINCT
您可以在查询中使用关键字进行修复。使用 Spring Data JPA,您可以通过 2 种方式做到这一点:
- 您可以将方法名称从 更改
findAll
为findAllDistinctBy
。 - 您可以使用定义自己的查询
@Query("SELECT DISTINCT p FROM parent p")
Hibernate 将在您的 SQL 查询中包含 DISTINCT 关键字。您可以通过将查询提示设置为QueryHints.HINT_PASS_DISTINCT_THROUGH
来false
避免这种情况。
推荐阅读
- python - 从 python (jupyter notebook) 导入 R 库时出现问题,它返回错误“rpy2.rinterface.NULL”
- r - 使用 REAT 包中的 locq2 时出错,“要替换的项目数不是替换长度的倍数”
- java - @CrossOrigin 无法使用 Spring Boot。我该如何修复它?
- jsonschema - 导入模式但重新定义定义
- regex - 如何匹配特定字符串后的数字而没有积极的回溯?
- java - 有没有办法在每次迭代中使用递增数字作为对具有不同数字的方法的调用
- python - ReadFromPubSub->CloudStorage->BigQuery:订阅的大小永远不会减少,而且似乎只有 0.002% 的订阅到达 BigQuery
- microsoft-graph-api - 连接到 Graph API 以获得教育应用程序权限
- javascript - 如何将跨度值传递给laravel控制器
- wordpress - 如何在 WordPress 中添加重写规则以在自定义插件文件夹中提供图像