2016-03-31 2 views
1

Как я могу добиться этогоHibernate присоединиться без CreateQuery()

session 
    .createQuery(
     "select person from Pet pet " + 
     "inner join pet.person person " + 
     "where person.age = 32) 
    .list(); 

путем, вместо того, чтобы использовать HQL, использовать Hibernate функции, такие как createCriteria(), createAlias ​​(), setProjection(), и т.д.?

+0

Есть ли у человека «отношение» к «любимому»? –

+0

Нет, это моя главная проблема, я думаю. Нет изображения от Person -> Pet, только Pet -> Person. – darksmurf

+0

И запрос должен вернуть всех лиц в возрасте 32 лет, у которых есть домашнее животное, связанное с ними? –

ответ

2

Что-то, как это должно работать

Criteria crit = session.createCriteria(Person.class); 
crit.createAlias("pet", "pet"); 
crit.add(Restrictions.eq("age", 32); 
crit.list(); 

createAlias используется только для внутреннего соединения с Pet, если точка перечислить всех лиц в возрасте от 32, которые имеют домашних животных.

EDIT После комментариев о модели и требованиях попробуйте это. Не очень, но он должен работать

Criteria c = session.createCriteria(Person.class, "person"); 
c.add(Restrictions.eq("age", 32)); 
DetachedCriteria dc = DetachedCriteria.forClass(Pet.class, "pet"); 
dc.add(Property.forName("pet.person_id").eqProperty("person.id")); 
c.add(Subqueries.exists(dc.setProjection(Projections.id()))); 
List<Person> persons = c.list(); 
+0

Я не думаю, что это сработает, поскольку Лицо не знает, что у него есть домашнее животное, только Pet знает, что у него есть Человек. – darksmurf

+0

Я отредактировал свой ответ, надеюсь, этот новый код должен работать. –

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