多对多关系加载实体上的实体图多次-Spring Data JPA

时间:2019-01-31 07:08:44

标签: spring hibernate spring-boot spring-data-jpa entitygraph

我的两个实体之间有@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,而不是重复。 使用实体图时。

1 个答案:

答案 0 :(得分:0)

如果使用entity graph,则Hibernate会在查询中联接父表和子表。这会在结果集中创建一个产品,并且您会为其每个子级获得对父实体的引用。

您可以在查询中使用DISTINCT关键字进行修复。使用Spring Data JPA,您可以通过以下两种方式做到这一点:

  1. 您可以将方法名称从findAll更改为findAllDistinctBy
  2. 您可以使用@Query("SELECT DISTINCT p FROM parent p")
  3. 定义自己的查询

Hibernate将在SQL查询中包含DISTINCT关键字。您可以通过设置query hint QueryHints.HINT_PASS_DISTINCT_THROUGH to false来避免这种情况。