HQL Query, чтобы проверить, равен ли размер коллекции 0 или пустой
Я пытаюсь сгенерировать запрос HQL, который включает пользователя с пустыми коллекциями appoinment (отображается OneToMany):
SELECT u FROM User u JOIN u.appointments uas WHERE u.status = 1 AND (uas.time.end < :date OR size(uas) = 0)
Я использую несколько способов (NOT EXIST ELEMENT(), IS NULL
)
также см.: Как проверить, нет ли коллекции в NHibernate (HQL)? (Это не работает для меня)
но все же не результат, который я хочу увидеть или какая-либо ошибка в HQL или SQL SERVER
Примечание:
запрос без работы JOIN:
"FROM User u WHERE u.status = 1 AND size(u.appointments) = 0"
решаемые
Другой JOIN решил проблему:
SELECT u FROM User u LEFT JOIN u.appointments pas1 LEFT JOIN pas1.slot t WHERE u.status = 1 AND t.end <= :date1 OR t.end IS NULL ORDER BY u.name asc
Ответы
Ответ 1
Использование IS EMPTY
должно работать (я бы предпочел синтаксис JPQL):
SELECT u FROM User u WHERE u.status = 1 AND u.appointments IS EMPTY
Если это не так, покажите сгенерированный SQL.
Ссылки
- Справочное руководство по Hibernate Core
- Спецификация JPA 1.0
- Раздел 4.6.11 "Выражения сравнения пустых коллекций"
Ответ 2
Вы взглянули на свой сгенерированный SQL? Ваш метод отлично работает здесь:
// Hibernate query:
const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";
// Generates this working SQL:
select user0_.Id as Id20_,
user0_.Name as Name2_20_
from User user0_
where user0_.Id = 101
and (select count(appointment1_.Id_Solicitud)
from Appointment appointment1_
where user0_.Id = appointment1_.Id_User) = 0
Ответ 3
//Запрос на спящий режим:
const string hql = "от пользователя u, где u.Id = 101 и размер (u.Appointments) = 0";