在升级到较新的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
子句中使用这个别名。但在某些查询中,WHERE
没有明确给出,但CC_4子句仍然使用引用实体的属性。它在那里也会失败吗?发生了什么变化,以至于在切换到新的JBoss版本后突然失败?
下面的问题与这个问题有关,包括解决方案,但不解释问题。
查询应该是
SELECT entityA FROM EntityA entityA
JOIN FETCH entityA.entityB entityB
LEFT JOIN FETCH entityB.someField
WHERE entityB.anotherField LIKE :someParameter
。您应该为每个已连接的实体分配一个别名,并在随后的连接或限制中使用该别名。
我在我的项目中有同样的麻烦,它很难解决,因为我有一个大的遗留系统,有很多模块使用预编译的命名查询和按需创建的查询。使用旧版本的hibernate识别和修改整个系统,并在正常工作的地方进行更改是一项非常烦人的工作,而且容易出错。当hibernate版本从4.2.18升级到4.2.22时,我在JBoss从6.4到6.4.6中经历了这个问题,出现了这个错误。为了解决这个问题,我只将hibernate主模块降级到初始默认版本4.2.18,但这并不好,因为当JBoss的下一个补丁到达时,我需要再次更改它。我正在尝试使用JBoss模块和persistence.xml和JBoss -deployment- structure .xml中的一些配置,但还没有成功。