Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: [Решено] LEFT JOIN и Hibernate Criteria API  (Прочитано 2285 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн VestniK

  • Автор темы
  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
[Решено] LEFT JOIN и Hibernate Criteria API
« : 16 Июня 2010, 23:43:28 »
Интересно обитают ли здесь жабакоеры. У меня сегодня возникла потребность выполнении одного запроса через Hibernate Criteria. Ситуация примерно следующая:

Есть entity Person содержащий общие данные о человеке. На него через @ManyToOne смотрит куча других сущностей, а вот в нём нету встречного маппинга через @OmeToMany(mappedBy="...") и не будет. Мне нужно выполнить запрос который содержит LEFT JOIN на другие сущности, но запрос в данном месте необходимо сконструировать через Hibernate Criteria API (это lazy loading paginated список с нетривиальными фильтрами которые собственно и строятся через Criteria API). Если бы был встречный маппинг я бы использовал DetachedCriteria.addAlias("joinedAlias","reverseMappingField",DetachedCriteria.LEFT_JOIN), а как сделать то же самое если встречного маппинга нет?

Для примера можно представить такую ситуацию она близка к тому что нужно получить в одном из фильтров:
(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 17 Июня 2010, 08:08:07:
После продолжительного гугления пришёл к выводу, что то, что я хочу сделать, нужно делать по другому, используя IN и подзапрос в условиях отбора:
SELECT p.* FROM person p WHERE p.id NOT IN (SELECT u.person FROM user u WHERE u.enabled=TRUE)

Такой запрос уже можно переложить на Criteria:
DetachedCriteria subquery = DetachedCriteria.forClass(User.class);
subquery.setProjection(Projections.property("person.id"));
subquery.add(Restrictions.eq("enabled",true));

DetachedCriteria criteria = DetachedCriteria.forClass(Person.class);
criteria.add(Property.forName("id").in(subquery));

« Последнее редактирование: 17 Июня 2010, 16:11:56 от VestniK »

 

Страница сгенерирована за 0.015 секунд. Запросов: 22.