HQL-запрос, чтобы проверить, равен ли размер коллекции 0 или пуст - PullRequest
25 голосов
/ 21 сентября 2010

Я пытаюсь сгенерировать HQL-запрос, включающий пользователя с пустыми коллекциями назначений (сопоставленных 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

Ответы [ 3 ]

43 голосов
/ 21 сентября 2010

Использование 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 «Выражения сравнения для пустой коллекции»
13 голосов
/ 21 сентября 2010

Вы смотрели на ваш сгенерированный 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
6 голосов
/ 21 января 2015
// Hibernate query:
const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...