Подзапрос Hibernate NOT IN на соединительной таблице - PullRequest
7 голосов
/ 23 марта 2012

Я пытаюсь выполнить запрос в спящем режиме, как следующий SQL-запрос:

SELECT phone.* FROM phone WHERE phone.id NOT IN (SELECT phone_id FROM user_phone)

У меня есть следующие классы сущностей:

@Entity
class User {
    @Id
    private Integer id;

    @ManyToMany
    private Set<Phone> phoneList;

}

и класс Phone:

@Entity
class Phone {

    @Id
    private Integer id;

    private String description;

}

Hibernate автоматически создает таблицу соединений с именем user_phone.Теперь я хотел бы выбрать все телефоны, которые не используются ни одним пользователем.Я просто не могу понять, как это сделать с Hibernate.Я пробовал следующее:

Session session = (Session) entityManager.getDelegate();
Criteria criteria = session.createCriteria(Phone.class);

DetachedCriteria subCriteria = DetachedCriteria.forClass(User.class);
subCriteria.setProjection(Property.forName("phoneList"));

criteria.add(Subqueries.propertyNotIn("id", subCriteria))

Но это возвращает всех пользователей, у которых идентификатор не совпадает с идентификатором любого из телефонов.Так что это не то, что я ищу.

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

6 голосов
/ 28 марта 2012
Criteria criteria = session.createCriteria(Phone.class)
    .add(Subqueries.propertyNotIn("id", DetachedCriteria.forClass(User.class)
        .createAlias("phoneList", "phone")
        .setProjection(Property.forName("phone.id"))
    ));
3 голосов
/ 30 января 2014

Поскольку я пришел сюда в поисках того, как сформировать подзапрос, а не критерии, мне интересно, могут ли другие люди тоже оказаться здесь таким же образом.

Поскольку я понял, как написать запрос на HQL, я хотел поделиться решением, на всякий случай:

from phone p where p.id not in (select ph.id from User u join u.phoneList ph)

Работал для меня, впохожий сценарий.Надеюсь, это поможет!

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