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

标签 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 存储库,定义如下:

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 创建包含 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)
}

关于hibernate - 使用 NamedEntityGraph 进行急切获取返回太多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37682727/

相关文章:

java - 属性 'driverClassName' 抛出异常;无法加载 JDBC 驱动程序类 [org.postgresql.Driver]

java - 通过复合主键之一查找记录

java - 如何在没有冲突的情况下使用spring jpa将记录插入数据库

java - Spring data JPA 获取数据作为对象列表的流

spring-data - 延迟加载 Spring Data JPA 存储库

java - 如何在Spring动态Web项目中创建自动表

java - 为什么我无法检索刚刚保留的实体?

java - org.hibernate.HibernateException : Not able to obtain connection

java - 如何使用 REST API 将子对象添加到父对象?

java - Spring 数据 JPA( hibernate ): How do I retrieve a concrete entity using only a field in its abstract superclass?