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

时间:2016-06-07 14:54:15

标签: hibernate spring-data-jpa

我有以下实体:

@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 Repository:

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-annotations。

我的数据库的Text-table中有2个条目,每个条目在TextRow表中有3个条目。

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

这些SO问题描述了我的问题并给了我一个解决方案:

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

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)
}