1

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

4

1 回答 1

1

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

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

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

Hibernate 将在您的 SQL 查询中包含 DISTINCT 关键字。您可以通过将查询提示设置为QueryHints.HINT_PASS_DISTINCT_THROUGHfalse避免这种情况。

于 2019-01-31T14:02:19.107 回答