Критерии гибернации: объединение таблицы без сопоставленной связи - PullRequest
69 голосов
/ 06 апреля 2009

Я хотел бы использовать критерии API Hibernate для формулирования конкретного запроса, объединяющего две сущности. Допустим, у меня есть две сущности: Pet и Owner, у владельца которых много домашних животных, но, что важно, эта связь не отображается в аннотациях Java или xml.

С помощью hql я мог выбрать владельцев, у которых есть домашнее животное по имени 'fido', указав соединение в запросе (вместо добавления набора домашних животных в класс владельца).

Можно ли сделать то же самое, используя критерии гибернации? Если так, то как?

Спасибо, J * +1007 *

Ответы [ 5 ]

77 голосов
/ 20 января 2010

Это действительно возможно с критериями:

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class);
ownerCriteria.setProjection(Property.forName("id"));
ownerCriteria.add(Restrictions.eq("ownername", "bob"));

Criteria criteria = getSession().createCriteria(Pet.class);
criteria.add(Property.forName("ownerId").in(ownerCriteria));

Обновление : на самом деле вместо соединения выполняется подзапрос, но он позволяет использовать критерии для двух объектов, для которых не определены отношения гибернации.

61 голосов
/ 06 апреля 2009

Насколько я понимаю, если вы делаете это с помощью HQL, вы создаете декартово соединение с фильтром, а не внутреннее соединение. Запросы по критериям не поддерживают это.

1 голос
/ 15 апреля 2009

В NHibernate вы можете использовать подзапросы, которые определены как DetachedCriteria. Не уверен, что он работает так же в Java, скорее всего, это то же самое:

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet")
  .SetProjection(Projections.Property("pet.ownername"))
  .Add(/* some filters */ );

session.CreateCriteria(typeof(Owner))
  .Add(Subqueries.PropertyIn("name", pets);

Предполагается, что к нему присоединяется имя владельца.

0 голосов
/ 20 мая 2015
Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM   Owner WHERE ownerName ='bob');
Criteria criteria = getSession().createCriteria(Pet.class);
criteria.createCriteria("ownerId").add(ownerCriterion);
0 голосов
/ 06 апреля 2009

Есть SQLCriterion, который вы можете дать произвольно SQL и добавить к своему Criteria. В строке SQL маркер {псевдоним} "будет заменен псевдонимом корневого объекта."

...