我通常使用JPQL来查询数据库,但是今天出于性能原因和JPQL(联接子查询)中不可用的功能,我不得不使用本机查询。使用JPQL,可以使用连接提取来检索父实体及其子实体的集合。但是,当我尝试使用本机查询时,对于每个父实体,将返回多行,每行包含父及其子项之一的数据。然后,返回的列表包含父对象的重复对象。假设一个父母有两个孩子,那么下面的查询返回列表中的两个父母而不是1。
@Query(value="select * from Parent p left join Child c on p.parent_id = c.parent_id", nativeQuery = true)
List<Parent> getParents()
任何人都知道如何避免重复的父母,因此返回的结果如下所示
@Query(value="select p from Parent p left join fetch p.children")
List<Parent> getParents()
答案 0 :(得分:0)
由于您没有共享本机查询,因此很难说出导致基数增加的原因,但是使用DISTINCT
可能是一种方法,但这取决于您的实际选择。
如果您对允许您停留在JPA模型领域中的方法感兴趣,则应该看看Blaze-Persistence,它在JPA / Hibernate的from子句中提供了子查询支持:{ {3}}
使用https://persistence.blazebit.com/documentation/core/manual/en_US/index.html#subquery-in-from-clause和Entity-Views,这一切都非常简单。如果您分享用例并感兴趣,我可以帮助您弄清楚它的外观。