当前位置: 首页 > 面试题库 >

Hibernate(JPA)如何执行热切查询,加载所有子对象

满言
2023-03-14
问题内容

关于我之前的问题,我想确保所有子对象都已加载,因为我有多个线程可能需要访问数据(从而避免延迟加载异常)。我知道执行此操作的方法是在查询(EJB QL)中使用“fetch”关键字。像这样:

select distinct o from Order o left join fetch o.orderLines

假设模型中包含一个OrderOrderLines

我的问题是,似乎需要“ distinct”关键字,否则我似乎会Order为每个关键字找回一个OrderLine。我做对了吗?

也许更重要的是,是否有一种方法可以拉入所有子对象,无论深度如何?我们大约有10-15个类,对于服务器,我们将需要加载所有内容…我避免使用FetchType.EAGER它,因为这意味着它一直很渴望,尤其是Web前端加载了所有内容-
但这也许是可行的-你做什么?我似乎记得我们曾经尝试过此方法,然后获得了非常慢的网页-但这也许意味着我们应该使用二级缓存?


问题答案:

更改注释不是IMO的好主意。由于无法在运行时将其更改为惰性。最好使所有内容都变得懒惰,并根据需要获取。

我不确定在没有映射的情况下是否理解您的问题。左连接提取应该是您描述的用例所需要的。当然,如果订单行有一个订单作为其父订单,那么您将为每个订单行取回订单。



 类似资料:
  • 我有以下疑问。我想知道为什么在使用JPA和Hibernate时,在ManyToOne或OneToMany关系中执行热切加载时,它会调用DB以获取实体信息,但另外,还会生成后续查询以获取每个子级。 另一方面,当使用带有JOIN FETCH的查询时,它会像我所期望的那样执行查询,同时获取所有信息,因为fetchType被表示为“Eager”。 这里是一个简单的例子: 我有一个和班级教室有很多关系的班级

  • 我通过提示检查了它在EclipseLink中的工作情况: 这个链接http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html暗示通过Hibernate是不可能的,建议手动获取。但是,我无法理解如何通过HQL或标准来实现它,特别是如何获得不在实体上但仅存在于数据库上的child.parent_id列。即避

  • 所以myTable有一个列,我需要从中获取最大id并在查询中使用它。 最后一行给了我一个错误: 运行查询时出错:在EntityManager中创建查询时出现异常:< br > Java . lang . illegalargumentexception:在EntityManager中创建查询时出现异常:异常描述:语法错误解析[上面的查询]。[214,214]必须为范围变量声明提供标识变量。

  • 问题陈述:在JPA hibernate中,我执行了一个方法

  • 我的桌子描述是 我的疑问是 如何使用hibernate执行此查询。Hibernate应该返回类型为的对象列表。?