Как я могу выразить этот запрос, используя Hibernate HQL и Criteria api? - PullRequest
1 голос
/ 22 декабря 2010

ВЫБРАТЬ ГОРОДА. * ИЗ ГОРОДОВ, ГДЕ CITIES.STATE_ID IN (ВЫБРАТЬ STATES.STATE_ID из ГОСУДАРСТВ, ГДЕ STATES.COUNTRY_ID = 78)

РЕДАКТИРОВАТЬ:

Вот классы

Country.java

Integer id;
String name;

State.java

Integer id;
Integer countryId;
String name;

City.java

Integer id;
Integer stateId;
String name;

Я пытаюсь получить все города, которые принадлежатопределенная страна (скажем, страна с идентификатором 78)

Ответы [ 2 ]

3 голосов
/ 22 декабря 2010

Критерии API работает с реляционным отображением.Если нет никакой связи между городом, штатом или страной, вы не можете использовать что-то вроде вышеупомянутого решения.У меня есть два предложения. Во-первых, вы можете использовать два критерия.

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(State.class);
ownerCriteria.setProjection(Property.forName("id"));
ownerCriteria.add(Restrictions.eq("countryId", countryParam));


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

Во-вторых, используйте hql с перекрестным соединением.Взгляните на здесь .

Наконец, я думаю, что лучше написать этот запрос с нативным SQL.;)

0 голосов
/ 22 декабря 2010

Трудно сказать, когда вы не отображаете классы отображения и / или домена.Тем не менее, вам не нужно подзапрос для этого запроса (хотя он будет возвращать те же результаты, и это нормально).

Вы можете сделать это так:

ICriteria crit = session.CreateCriteria <City>();
crit.CreateAlias ("State", "s");
crit.CreateAlias ("s.Country", "cntry");
crit.Add (Expression.Eq ("cntry.Id", 78));

var results = crit.List<City>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...