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

JPA/Hibernate左联接提取延迟异常,因为联接的实体为空

敖子安
2023-03-14
SELECT emp FROM Employee emp LEFT JOIN FETCH emp.supervisor WHERE emp.supervisor_id = :id_number
employee_ id, first_name, last_name, supervisor_id
           1,       jeff,     jones,             2
           2,        bob,     smith,             3
 etc...
 org.hibernate.LazyInitializationException: could not initialize proxy - no Session
#{employee.supervisor.last_name} 
employee_ id, first_name, last_name, supervisor_id
           4,       jane,     dean,          9999
where employee_id 9999 doesn't exist in my read-only data feed

最初,我在supervisor字段上用@NotFound(action=NotFoundAction.Ignore)注释了我的Employee实体,但这导致实体管理器生成大量SQL调用,从而降低了应用程序的性能。JPA/Hibernate查询速度慢,查询太多

@Entity
Employee

@OneToOne(fetch = FetchType.LAZY)
//Removed  @NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "supervisor_id", insertable = false, updatable = false)
private Employee supervisor;

是我的Employee实体上缺少了一些将填充空主管的构造函数,还是对我的查询进行了一些修改,将像注释那样执行Ignore,而不需要大量的单独SQL调用?

共有1个答案

步博艺
2023-03-14

解决方案是使用专有注释禁用惰性关系的代理:

@org.​hibernate.​annotations.LazyToOne(LazyToOneOption.NO_PROXY)

在此之后,惰性左联接提取开始使用null表示不出现联接,而不是惰性代理。

有一个HACK可以禁用所有*toone惰性字段:

 类似资料:
  • > 我想在一次调用“Select P from Parent left join fetch P.children where P.id=:id”中获得一个包含所有子对象的父对象(我认为它是一个left outer join)。这只会在P至少有一个子对象时才会产生结果 我想也有所有的儿童和财产childinfos与1调用,因为jpa不支持导航p.children.childinfo,有没有办法实现

  • 问题内容: 这是我的namedquery: @NamedQuery(name =“ User.findOneWithLists”,查询=“从用户u中选择u” +“左联接FEACH u.aTemplates” +“左联接FE.bTemplates” +“左联接FE.bp” +“左JOIN FETCH u.aCredentials“ +” LEFT JOIN FETCH u.st(st.deleted

  • 问题内容: 我们有下面的查询。使用LEFT OUTER联接需要9秒钟才能执行。将LEFT OUTER更改为LEFT INNER可以将执行时间减少到2秒,并且返回 相同 数量的行。由于正在处理dbo.Accepts表中相同数量的行,而不论联接类型如何,为什么外层要花3倍的时间? 问题答案: 返回相同行数的事实是事后事实,查询优化器无法预先知道Accepts中的每一行在Marker中都有匹配的行,可以

  • 我正在尝试JPA2.1(eclipselink)中的“treat as”函数,但遇到了一个来自JPA的错误: 异常说明:ReportQuery结果大小不匹配。应为[263],但已检索到[197] 下面是我的JPQL查询(我更改了一些部分,以便更明确): 我们可以看到account和ad_account之间的左外部连接。此外,ad_account表不存在于select子句中。(idApp字段是主键的

  • 我需要从Rest控件获取一个实体及其集合,但我对spring data JPA有一个非常奇怪的行为。 我对带有懒惰加载的实体有一种莫名其妙的关系。