7

このJPAクエリを作成する正しい方法は何ですか?うまくいかなかったり、JPAの本で見つけられなかったりするので、推測しているだけです。

Query query=em.createQuery("select m from Meeting m where count(m.attendees) = 0");
return query.getResultList();

私は現在Hibernateでこれを試していますが、mysqlエラーが発生します!

ERROR org.hibernate.util.JDBCExceptionReporter - You have an error in your
SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near ')=0' at line 1
4

1 に答える 1

12

質問のタイトルに厳密に答えるには、次を使用しますSIZE

Query query=em.createQuery("select m from Meeting m where size(m.attendees) = 0");
return query.getResultList();

JPA仕様から:

4.6.16.2算術関数

functions_returning_numerics::=
ABS(simple_arithmetic_expression) |
SQRT(simple_arithmetic_expression) |
MOD(simple_arithmetic_expression, simple_arithmetic_expression) |
SIZE(collection_valued_path_expression)

ABS関数は数値引数を取り、関数の引数と同じ型の数値(integer、float、またはdouble)を返します。

SQRT関数は数値引数を取り、doubleを返します。

MOD関数は2つの整数引数を取り、整数を返します。

SIZE関数は、コレクションの要素数である整数値を返します。コレクションが空の場合、SIZE関数はゼロと評価されます。

これらの関数の数値引数は、Javaオブジェクトの数値型およびプリミティブの数値型に対応している場合があります。

の特定のケースでは0IS EMPTY

4.6.11空のコレクション比較式

empty_collection_comparison_expressionで比較演算子を使用するための構文IS EMPTYは 次の とおりです。

collection_valued_path_expression IS [NOT] EMPTY

この式は、コレクション値のパス式で指定されたコレクションが空であるかどうか(つまり、要素がないかどうか)をテストします。

例:

SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY

空のコレクション比較式のコレクション値パス式の値が不明な場合、空の比較式の値は不明です。

両方をテストして、どちらが最も効率的かを確認します(クエリプランを確認してください)。

于 2010-08-18T08:16:10.140 に答える