【问题标题】:Entity graph on many-to-many relation loading entities multiple times - Spring Data JPA多次在多对多关系加载实体上的实体图 - Spring Data JPA
【发布时间】:2019-01-31 07:08:44
【问题描述】:

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

【问题讨论】:

  • 父母在响应负载中重复。“响应负载”是什么意思?如果您谈论的是 JSON 表示,那么 @EntityGraph 不会帮助您。
  • 响应负载是指我得到的 JSON 输出。我多次得到每个父母的组合(等于孩子的数量)

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 找不到 ServiceBundle 类型的属性 findDistinctAll!当我尝试使用 findDistinctAll 时,我得到了这个
  • 对不起,我的错误。它必须是 findAllDistinctBy。我也更新了我的回复。
  • 您的博客确实帮了我很多忙,感谢您在网站上提供的所有材料。 BTW public List listAll() { 谓词 p = null;长启动 = System.currentTimeMillis(); List lst = repo.findAllDistinctBy(p); log.debug("DB Time to list parents = " + (System.currentTimeMillis() - start));返回 lst; } 我应该怎么做才能只列出所有父母一次?
  • 我不明白你的问题。您的代码不是返回一个只包含所有父母一次的列表吗?
  • 我已经编辑了这个问题。请查看最后添加的信息。
猜你喜欢
  • 2021-05-25
  • 2013-04-25
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多