当前位置: 首页 > 知识库问答 >
问题:

如何使用hibernate jpa本机查询检索带有子实体集合的父实体?

夏侯瑞
2023-03-14

我通常使用JPQL查询数据库,但今天我不得不使用原生查询,因为性能原因和JPQL中没有的特性(联接子查询)。使用JPQL,可以使用join fetch来检索父实体及其子实体集合。然而,当我尝试使用本机查询时,对于每个父实体,将返回多行,每行包含父实体及其子实体之一的数据。然后返回的列表包含父级的重复对象。假设一个父级有两个子级,那么下面的查询将在列表中返回2个父级,而不是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()

共有1个答案

弘和同
2023-03-14

由于您没有共享本机查询,因此很难判断基数增加的原因,但是使用distinct可能是一种方法,但这取决于您实际选择的内容。

如果您对一种允许您停留在JPA模型领域的方法感兴趣,您应该研究一下Blaze-Persistence,它在JPA/Hibernate之上的from子句中提供了子查询支持:https://persistence.blazebit.com/documentation/core/manual/en_美国/index.html#subquery-in-from-clause

有了实体视图和Spring-Data集成,所有这些都变得非常简单。如果您分享您的用例并感兴趣,我可以帮助您弄清楚这可能是什么样子。

 类似资料:
  • 问题内容: 这是我的情况,我有两个基本的POJO,并给出了一个简单的休眠映射: 我的SQL查询返回的行看起来像这样: 我的休眠查询如下所示: 这是每个部分的内容:Hibernate文档的18.1.3:http : //docs.jboss.org/hibernate/core/3.6/reference/zh- CN/html/querysql.html#d0e17464 我希望在清单中得到的是2

  • 问题内容: 这是我的情况,我有两个基本的POJO,并给出了一个简单的hibernate映射: 我的SQL查询返回的行看起来像这样: 我的hibernate查询如下所示: 这是每个部分的内容:Hibernate文档的18.1.3:http : //docs.jboss.org/hibernate/core/3.6/reference/zh- CN/html/querysql.html#d0e1746

  • 我的问题很简单,但找到解决办法却成了一项相当乏味和困难的任务。 我有两个冬眠实体, (或“父”实体)有三个字段, (实体的集合-关系)。 当从的集合中删除时(从对象的集合中删除和通过Dog存储库从数据库中删除),以及更新所有者的地址,然后尝试将更新后的对象保存到数据库中,将引发以下异常: 解决这个问题的一种方法是,在更新集合后,通过使用调用所有者的,获取的新版本,然后更新所有者的地址并将实体保存到

  • 我正在使用jpa 2.1 EntityGraphs来修改不同的jpa查询,在某些情况下,EntityGraph不能按预期工作。我正在努力解决的简单用例是: 作者作为父类,与Book子类具有单向一对多关系,我想检索给定书名的作者结果,类似于findAllAuthorsByBookName。 我的作者类是这样的 书没有引用作者,所以它看起来像这样 Generic Entity类仅具有id和name属性

  • 我正在寻找一种方法,使用带有元模型的jpa criteria查询API来选择父实体的所有子实体。 表族 } 表家庭成员 现在,我想在选择family时选择family的所有子实体,而不是使用更慢的方法来获取所有family的列表,循环列表并填充family member list。 为了实现这个结果qith平原SQL,我写这样一个查询: 现在我的问题是,如何将本机查询转换为criteria API

  • 问题内容: 我有一个实体类和一个基于该实体的子类: 和 我需要发出仅在基类(A)上使用存储过程的本机查询。如果我尝试如下: 我收到有关“在ResultSet中未找到clazz_列”的错误。我假设JPA提供程序添加了此列,以便区分基类和扩展类。我可以通过显式添加clazz列和子类中的所有字段来解决此问题: 其中“ prop1”和“ prop2”是子类B的属性。但是,这似乎是不必要的修改,并且如果子类