8.17.9 JPQL使用時の注意事項
ここでは,JPQL使用時の注意事項について説明します。
- 〈この項の構成〉
(1) null値の注意事項
-
クエリ結果のnull値
-
クエリの結果の値が,null値を持つ関連フィールドまたはステートフィールドに対応する場合,そのnull値がクエリメソッドの結果として返されます。
-
IS NOT NULLの構文は,クエリの結果の集合からnull値を除去するために使用できます。
-
Javaの数値系プリミティブ型によって定義されるフィールドには,クエリの結果としてnull値を生成できません。
-
-
比較,条件式でのnull値
-
参照の対象がデータベースに存在しない場合,その値はnullとみなされます。null値を検索するには,比較条件IS NULLおよびIS NOT NULLだけが使用できます。
-
null値をIS NULLやIS NOT NULL以外の条件で使用して,その結果がnull値に依存する場合,結果はunknownになります。
-
null値の比較または算術操作の結果は,常にunknown値になります。
-
二つのnull値の比較結果はunknown値になります。
-
unknown値のある比較または算術操作の結果は,常にunknown値になります。
-
boolean演算子は3値論理を使用します。ANDの場合,ORの場合,およびNOTの場合の3値論理式をそれぞれ表に示します。
表8‒24 ANDの3値論理式(A AND Bの結果) A
B
True
False
Unknown
True
True
False
Unknown
False
False
False
False
Unknown
Unknown
False
Unknown
表8‒25 ORの3値論理式(A OR Bの結果) A
B
True
False
Unknown
True
True
True
True
False
True
False
Unknown
Unknown
True
Unknown
Unknown
表8‒26 NOTの3値論理式(NOT Aの結果) A
NOT Aの結果
True
False
False
True
Unknown
Unknown
-
(2) HiRDBでJPQLを使用する場合の注意事項
-
次に示すJPQLの関数の引数に,位置パラメタや名前パラメタを指定することはできません。
TRIM,SQRT,ABS,LENGTH,LOWER,MOD,LOCATE,UPPER,CONCAT,SUBSTRING,IS [NOT] NULL
これらの関数の引数に位置パラメタや名前パラメタを指定した場合,動作は保証されません。なお,位置パラメタや名前パラメタを指定した場合はHiRDBのSQL構文エラーとなり,SQLException例外を含んだPersistenceException例外をスローすることがあります。
これらの関数の機能を使用したい場合は,ネイティブクエリを使用してください。
-
四則演算子(+,−,*,/)の両側に?パラメタは指定できません。また,比較演算子(=,>,>=,<,<=,<>)の両側に?パラメタを指定したり,片側に?パラメタを指定したりしてもう一方にリテラルを指定することはできません。指定した場合の動作は保証されません。指定した場合はHiRDBのSQL構文エラーとなり,SQLException例外を含んだPersistenceException例外をスローすることがあります。
JPQLの中で四則演算や比較演算しないで,JPQLを使用する前に四則演算や比較演算の操作をしてからJPQLを使用するようにしてください。
HiRDBでJPQLを使用する場合に使用できないクエリの記述例を次に示します。
使用できない例1:関数の引数に位置パラメタを指定する
Query query1 = em.createQuery( "SELECT o FROM TestEntity o "+ "WHERE o.name=TRIM(LEADING FROM ?1)") .setParameter(1, " SatoTaro");
使用できない例2:四則演算子に位置パラメタを指定する
int no_A=2; int no_B=4; Query query2 = em.createQuery( "SELECT o FROM TestEntity o WHERE o.id = ?1 + ?2") .setParameter(1, no_A) .setParameter(2, no_B);
使用できない例3:比較演算子に位置パラメタを指定する
int cmp_no=3; Query query3 = em.createQuery( "SELECT o FROM TestEntity o WHERE o.id = ?1 AND ?1 < 9") .setParameter(1, cmp_no);