我有以下实体:
@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个文本实例的列表。
我不明白为什么会这样。有人可以给我一些指导或解决方案吗?
谢谢!
答案 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)
}