7

新しい休止状態バージョンにアップグレードした後(JBoss4.2.2からJBoss6への切り替えに付属していると推測されます)、一部のクエリは次のメッセージで失敗します。

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

私のプロジェクトでも同じ問題があり、解決するのは非常に困難です。なぜなら、プリコンパイルされた名前付きクエリとオンデマンドで作成された多くのクエリを使用する多くのモジュールを備えた大規模なレガシー システムがあるためです。システム全体を特定して変更し、以前のバージョンの休止状態を使用して同様に機能していた場所を変更することは、非常に面倒な作業であり、エラーが発生しやすくなります。休止状態のバージョンが 4.2.18 から 4.2.22 にアップグレードされ、このエラーが表示されたときに、6.4 から 6.4.6 への JBoss でこの問題を経験しています。それを解決するために、休止状態のメイン モジュールのみを初期デフォルト バージョン 4.2.18 にダウングレードしますが、JBoss の次のパッチが到着したときに再度変更する必要があるため、これは良くありません。JBoss モジュールと persistence.xml および jboss-deployment-strcuture.xml のいくつかの構成を使用しようとしていますが、まだ成功していません。

于 2016-04-22T14:11:08.807 に答える