Как получить объекты, используя критерии, отдельные критерии и подзапрос - PullRequest
1 голос
/ 23 июля 2011

Уже четыре дня я пытаюсь выполнить запрос в своей базе данных.

Вот проблема:

  1. У меня есть группа из Пользователи
  2. Пользователи могут иметь дату рождения (может быть нулевой)
  3. Я хочу перечислить Группы , которые имеют нет Пользователи И Группы , в которых есть Пользователи , в которых все пользователи имеют нулевое значение для даты рождения

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

Пока этокод, который у меня есть:

Criteria c = session.createCriteria(Group.class);
c.createAlias("userCollection", "u", Criteria.LEFT_JOIN);
c.add(Restrictions.or(Restrictions.isNull("userCollection"), 
            Restrictions.isNull("u.birthDate")));

Это работает нормально, но когда у пользователя в группе есть не рождения, а дата рождения, группа все равно появляется в запросе, потому что у других в группе есть нулевая дата рождения.Я думаю, что мне нужно использовать не в , верно?

Если кто-нибудь может помочь, я много пробовал, но получаю исключение нулевого указателя.

1 Ответ

2 голосов
/ 23 июля 2011

Самый простой способ сделать это - исключить группы, в которых есть пользователи с ненулевым значением birthDate, которое одновременно выполняет оба условия (группы без пользователей не будут в этом списке из-за внутреннего объединения).

Итак, что-то вроде:

DetachedCriteria excludedGroups = DetachedCriteria.forClass(Group.class);
excludedGroups.createAlias("userCollection", "u");
excludedGroups.add(Restrictions.isNotNull("u.birthDate"));
excludedGroups.setProjection(Projections.id());

Criteria c = session.createCriteria(Group.class);
c.add(Subqueries.propertyNotIn("id", excludedGroups));

Кстати, сделать это через HQL будет еще проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...