我的两个实体之间有@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
}
我有父母2。
但是我想要的是只获得一次parent1,而不是重复。 使用实体图时。
答案 0 :(得分:0)
如果使用entity graph,则Hibernate会在查询中联接父表和子表。这会在结果集中创建一个产品,并且您会为其每个子级获得对父实体的引用。
您可以在查询中使用DISTINCT
关键字进行修复。使用Spring Data JPA,您可以通过以下两种方式做到这一点:
findAll
更改为findAllDistinctBy
。 @Query("SELECT DISTINCT p FROM parent p")
Hibernate将在SQL查询中包含DISTINCT关键字。您可以通过设置query hint QueryHints.HINT_PASS_DISTINCT_THROUGH
to false
来避免这种情况。