この節では、Java Persistence API に関する既知の問題とその解決方法を示します。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=572 を参照してください。
この種のクエリーは使用しないでください。
クエリーコンパイラは、仕様の Java Persistence 言語の章で定義されたすべてのルールをチェックするわけではありません。具体的には、次のチェックは行われません。
関数引数の型の互換性。
算術、論理、および比較演算子のオペランドの型の互換性。
ORDER BY クエリーの SELECT 句の要件。
無効なクエリーは、コンパイルできても実行時に SQLException が発生する可能性があります。また、配下のデータベースでは制約が少なく、生成された SQL がサポートされても、別のデータベースで同じクエリーを実行すると SQLException が発生して失敗する場合もあります。
上の条件を手動で確認してください。
JOIN 変数別にグループ化し、JOIN 変数を直接選択するクエリーを行うと、グループ化していない式が選択されていることを知らせる SQLException が発生する可能性があります。詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=197 を参照してください。次に例を示します。
SELECT AVG(o.totalPrice), c FROM Order o JOIN o.customer c GROUP BY c |
JOIN 変数を定義するのではなく、たとえば次のように直接関係を結びます。
SELECT AVG(o.totalPrice), o.customer FROM Order GROUP BY o.customer |
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=550 を参照してください。
クエリー内の間違いを手動で確認してください。
異なるクラス名を使用してください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=558 を参照してください。
MappedSuperclass の明示的な一覧表示はしないでください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=578 を参照してください。
サブクラスでは ManyToMany 関係を使用しないでください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=557 を参照してください。
代わりに java.util.Collection を使用してください。
Null にできるデータベース列にマップするには、Java ラッパータイプを使用してください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=404 を参照してください。
クライアントへインスタンスを返す前に、サーバー側コードで LAZY 初期化関係にアクセスしてください。
関係フィールドを選択するクエリーを行った場合、関係フィールドの値が Null のときにクエリー結果に Null が含まれません。このエントリはたとえば次のように、クエリー結果から省略されます。
SELECT o.customer FROM Order o WHERE ... |
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=637 を参照してください。
関連するインスタンスから状態フィールドを選択してください。
SELECT o.customer.customerId FROM Order o WHERE ... |
次に例を示します。
SELECT c FROM Order o LEFT OUTER JOIN o.customer c |
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=638 を参照してください。
関連するインスタンスから状態フィールドを選択してください。
SELECT c.customerId FROM Order o LEFT OUTER JOIN o.customer c |
主キークラスが @IdClass 注釈で定義されている場合、EntityManager.find() を行うと、別のエントリのサブクラスであるエンティティーに対して IllegalArgumentException が誤って発生します。詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=595 を参照してください。
find() メソッドへの引数として、最上位のスーパークラスのクラスを使用し、その結果をサブクラスへキャストしてください。
詳細については、https://glassfish.dev.java.net/issues/show_bug.cgi?id=643 を参照してください。
初期値として java.util.ArrayList を使用してください。