2012-05-15 3 views
0

Если у меня есть два класса объектов, Group и Person, где существует связь один-ко-многим между Group и Person (то есть, человек может принадлежать не более чем одной группе, группа может иметь много людей), какой запрос jpql/hql я могу использовать, чтобы выбрать все Person s не в Group s?JPA/Hibernate выберите элемент не в коллекции

Что-то вроде обратной select p from Group g inner join g.people p ...

ответ

1

Это сработало:

select p from Person p where p not in (select pg from Group g inner join g.persons pg) 

Может быть:

select p from Person p where not exists (select 1 from Group g where p member of g.persons) 

является более эффективным?

В любом случае ... комментарии приветствуются относительно того, что является более эффективным, но поскольку обе эти «работы», отмечая вопрос как ответ.

1

Если вы хотите, чтобы все лица, которые не находятся в данной группе г, она должна быть как

from Person p where p.group.id != :gid; 

и установить GID на id данной группы.

Если вы хотите, чтобы все лица, которые не в группе вообще

from Person p where p.group.id is null; 

Если вы хотите, чтобы все лица, которые не в группе в Аль, но это возможно внешний ключ в лицо имеет идентификатор группы, которая не является пустым, но не принадлежит к существующей группе (например, если группа была удалена без удаления лиц в ней и не перемещая их в другую группу)

from Person p where not exist (select 1 from Group g where g.id = p.group.id); 

PS Мои заявления являются для HQL, но для JPQL он должен быть более или менее одинаковым.

+0

Проблема в том, что отношения односторонние. 'Person' не имеет ссылки на' Group', только наоборот. Однако HQL - это хорошо. Отредактированный вопрос, чтобы отразить это. – Tonio

+0

Существует отношение 1: n от группы к человеку. Затем в базе данных пользователь таблицы имеет идентификатор группы как внешний ключ для группы. При правильном сопоставлении этого внешнего ключа можно получить доступ в экземпляре person - либо с отношением «много к одному», либо с использованием 'p.group.id ', как это было в примерах, или непосредственно в виде литерала, а затем использовать sth , например 'p.groupId'. Если внешний ключ еще не сопоставлен, я рекомендую его сопоставить - это намного быстрее, чем любая конструкция 'not exist' или' not in'. – Johanna

+0

Проблема в упорядочении коллекции, поэтому мне нужна таблица соединений для отслеживания индекса заказа, а не просто столбец «group id» в «Person». – Tonio

Смежные вопросы