2

単純なプロパティ変更で、JPA実装をEclipseLinkとHibernateの間で交換できるようにしたいと思います。これは問題なく実行できますが、問題の原因は名前付きクエリの検証です。EclipseLinkを使用して、次のようにフェッチ結合を作成する必要があります。

SELECT id 
FROM IndexDefinition id 
JOIN FETCH id.index 
JOIN id.index i
JOIN FETCH i.indexVersions

しかし、Hibernateを使用してこのクエリを検証すると、次の例外が発生します。

org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list 

したがって、次のようにクエリをHQLに適したものに変更できます。

SELECT id 
FROM IndexDefinition id 
JOIN FETCH id.index i
JOIN FETCH i.indexVersions

ただし、これにより、EclipseLinkで次の例外が発生します。

Exception Description Syntax error parsing the query [IndexDefinition.getForIndex] SELECT id FROM IndexDefinition id JOIN FETCH id.index i, syntax error at [id].
Internal Exception MismatchedTokenException(78!=-1)

DAOレベルでクエリヒントを使用してフェッチ結合を実行できることは知っていますが、特定のフェッチ結合構文を使用して両方のJPA実装を満足させる方法はありますか?

4

1 に答える 1

0

ネストされた結合はJPA1.0ではサポートされていないようです。JPA 1.0仕様から:

4.4.5.3フェッチ結合

FETCH JOINを使用すると、クエリ実行の副作用として関連付けをフェッチできます。FETCH JOINは、エンティティとその関連エンティティに対して指定されます。

フェッチ結合の構文は次のとおりです。

fetch_join ::= [ LEFT [OUTER] | INNER ] JOIN FETCH join_association_path_expression

FETCH JOIN句の右側で参照される関連付けは、クエリの結果として返されるエンティティに属する関連付けである必要があります。FETCH JOIN句の右側で参照されるエンティティの識別変数を指定することは許可されていないため、暗黙的にフェッチされたエンティティへの参照をクエリの他の場所に表示することはできません

次のクエリは、一連の部門を返します。副作用として、これらの部門に関連付けられている従業員も、明示的なクエリ結果の一部ではない場合でも取得されます。熱心にフェッチされる従業員の永続フィールドまたはプロパティは完全に初期化されます。取得される従業員のリレーションシッププロパティの初期化は、Employeeエンティティクラスのメタデータによって決定されます。

SELECT d
FROM Department d LEFT JOIN FETCH d.employees
WHERE d.deptno = 1

フェッチ結合の結合セマンティクスは、対応する内部結合または外部結合と同じですが、結合操作の右側で指定された関連オブジェクトがクエリ結果で返されたり、クエリで参照されたりしない点が異なります。したがって、たとえば、部門1に5人の従業員がいる場合、上記のクエリは部門1エンティティへの5つの参照を返します。

そのため、ネストされた結合は一部のJPAプロバイダーでサポートされている場合がありますが、動作は標準化されていません。

参考文献

于 2010-08-16T11:25:12.293 に答える