7

升级到更新的休眠版本后(猜测它是从 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 版本后突然出现故障?

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

4

2 回答 2

3

查询应该是

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

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

于 2012-06-22T07:22:42.117 回答
0

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

于 2016-04-22T14:11:08.807 回答