更新Hibernate后,“自动”连接获取嵌套实体失败

时间:2011-07-08 12:31:10

标签: hibernate join illegalargumentexception

升级到更新的hibernate版本后(猜测它是从JBoss 4.2.2到JBoss 6的转换),一些查询失败并显示消息:

Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName= (...)

使用如下查询时始终如此:

SELECT entityA FROM EntityA entityA 
JOIN FETCH entityA.entityB
LEFT JOIN FETCH entityA.entityB.someField
WHERE entityA.entityB.anotherField LIKE :someParameter

问题的解决方案是给“entityA.entityB”一个别名,然后在WHERE子句中使用此别名。但是在某些查询中,LEFT JOIN FETCH没有明确给出,但WHERE子句仍然使用被引用实体的属性。它会失败吗?发生了什么变化,以便在切换到新的JBoss版本后突然失败了?

以下question与此问题相关并包含解决方案,但不解释问题。

2 个答案:

答案 0 :(得分:3)

查询应为

SELECT entityA FROM EntityA entityA 
JOIN FETCH entityA.entityB entityB
LEFT JOIN FETCH entityB.someField
WHERE entityB.anotherField LIKE :someParameter

即。您应该为每个已连接的实体分配别名,并将此别名用于后续连接或限制。

答案 1 :(得分:0)

我在项目中遇到同样的麻烦并且很难解决,因为我有一个庞大的遗留系统,其中有很多模块使用预编译的命名查询和大量按需创建的查询。要识别和修改整个系统,并使用旧版本的hibernate进行更改,这是一个非常烦人的工作,容易出错。 当hibernate版本从4.2.18升级到4.2.22时,我在JBoss中遇到6.4到6.4.6这个问题,出现了这个错误。为了解决这个问题,我只将hibernate主模块降级到初始默认版本4.2.18,但这并不好,因为当下一个JBoss补丁到达时我需要再次更改它。我正在尝试使用JBoss模块和persistence.xml和jboss-deployment-strcuture.xml中的一些配置,但还没有成功。