【问题标题】:Eager fetching with NamedEntityGraph returns too many rows使用 NamedEntityGraph 急切获取返回太多行
【发布时间】:2016-10-07 13:18:36
【问题描述】:

我有以下实体:

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

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

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

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

谢谢!

【问题讨论】:

    标签: hibernate spring-data-jpa


    【解决方案1】:

    好的,看来我看到的是预期的行为。 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 2011-08-14
      • 2020-09-12
      • 1970-01-01
      • 2012-07-12
      相关资源
      最近更新 更多