升级到更新的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与此问题相关并包含解决方案,但不解释问题。
答案 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中的一些配置,但还没有成功。