Правильный способ подсчета связанных объектов с использованием JPQL - PullRequest
7 голосов
/ 18 августа 2010

Как правильно написать этот запрос 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

1 Ответ

11 голосов
/ 18 августа 2010

Чтобы строго ответить на заголовок вопроса, используйте 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 принимает числовой аргумент и возвращает число (целое число, число с плавающей запятой или двойное число) тот же тип, что и аргумент функция.

Функция SQRT принимает числовой аргумент и возвращает двойной.

Функция MOD принимает два целых числа аргументы и возвращает целое число.

Функция SIZE возвращает целое число значение, количество элементов коллекция. Если коллекция пусто, функция SIZE оценивает ноль.

Числовые аргументы этих функций может соответствовать числовой Java типы объектов, а также примитив числовые типы.

В частном случае 0 вы также можете использовать IS EMPTY

4.6.11 Выражения сравнения пустой коллекции

Синтаксис использования оператор сравнения IS EMPTY в empty_collection_comparison_expression выглядит следующим образом:

collection_valued_path_expression IS [NOT] EMPTY

Это выражение проверяет, действительно ли коллекция, обозначенная коллекционное значение пути пусто (т. е. не имеет элементов).

Пример:

SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY

Если значение коллекционного значения выражение пути в пустой коллекции выражение сравнения неизвестно, значение пустого сравнения выражение неизвестно.

Я бы протестировал оба, чтобы определить, какой из них наиболее эффективен (проверьте план запроса).

...