使用 NamedEntityGraph 进行急切获取返回太多行

问题描述 投票:0回答:2

我有以下实体:

@Entity
@NamedEntityGraph(name = "Text.WithRows", attributeNodes = { @NamedAttributeNode("rows") })
public class Text {
  @Id
  @Column(name = "uuid", nullable = false, unique = true)
  UUID uuid;

  @Column(name = "belongsTo")
  UUID belongsTo;

  @OneToMany
  @JoinColumn(name = "text_id")
  List<TextRow> rows;
}

@Entity
public class TextRow {
  @Id
  @Column(name = "uuid", nullable = false, unique = true)
  private UUID uuid;

  @Column(name = "content", nullable = false, length = 255)
  private String content;
}

我还有一个像这样定义的 Spring Data JPA 存储库:

public interface TextRepository extends PagingAndSortingRepository<Text, UUID>, JpaSpecificationExecutor<Text> {
  @EntityGraph(value = "Text.WithRows", type = EntityGraphType.LOAD)
  List<Text> findAllByBelongsTo(UUID belongsTo)
}

当我从存储库执行 find-Method 时,我希望立即加载 TextRows。因此,我在上面的代码中引入了 NamedEntityGraph 和 EntityGraph 注释。

我的数据库的文本表中有 2 个条目,每个 TextRow 表中有 3 个条目。

我希望 findAllByBelongsTo 方法返回一个包含两个文本实例的列表。相反,它返回一个包含 6 个文本实例的列表。

我不明白为什么会发生这种情况。有人可以给我一些指导或解决方案吗?

谢谢!

hibernate spring-data-jpa
2个回答
2
投票

好吧,看来我看到的是预期的行为。 Hibernate 创建包含 LEFT OUTER JOINS 的 SQL。这导致父表的 n x m 结果行。

这些问题描述了我的问题并为我提供了解决方案:

简而言之,我可以这样注释我的存储库:

public interface TextRepository extends PagingAndSortingRepository<Text, UUID>, JpaSpecificationExecutor<Text> {
  @EntityGraph(value = "Text.WithRows", type = EntityGraphType.LOAD)
  @Query("SELECT DISTINCT txt FROM Text txt WHERE txt.belongsTo = :belongsTo")
  List<Text> findAllByBelongsTo(@Param("belongsTo") UUID belongsTo)
}

0
投票

对于多方关联,请使用 Set<> 而不是 List<>,如下所述:

如何为多方关联选择最有效的数据类型 - Bag、List 与 Set

© www.soinside.com 2019 - 2024. All rights reserved.