Правильный способ подсчета связанных объектов с использованием JPQL

Как правильно написать этот запрос 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
7
задан Pascal Thivent 18 August 2010 в 08:16
поделиться

1 ответ

Чтобы точно ответить на заголовок вопроса, используйте 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 (простое_арифметическое_выражение) |
КОРЕНЬ (простое_арифметическое_выражение) |
MOD (простое_арифметическое_выражение, простое_арифметическое_выражение) |
РАЗМЕР (выражение_значного_путь_собрания)

Функция ABS принимает числовой аргумент и возвращает число (целое, с плавающей запятой или двойное) того же типа, что и аргумент функция.

Функция КОРЕНЬ принимает числовой аргумент и возвращает двойное значение.

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

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

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

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

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

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

 выражение_значение_путь_собрания ЕСТЬ [НЕ] ПУСТО

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

Пример:

 ВЫБРАТЬ o
ОТ Заказать o
ГДЕ о.lineItems ПУСТО

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

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

11
ответ дан 6 December 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: