Критерии гибернации, оставленные объединением двух столов - PullRequest
3 голосов
/ 10 февраля 2011

У меня есть две сущности, скажем, Business и Area.

Соответствующие свойства:Бизнес - зона, зона2, кодArea - areaId, areaName

area и area2 бизнес-карты с идентификатором в Area

Я пытаюсь написать критерий гибернации, который возвращает все области только для предприятий.

SQL выглядит следующим образом: ИЗ области a ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ бизнес b на a.areaId = b.area или a.areaId = b.area2 ГДЕ b.code! = Null GROUP BY a.areaName

Эточто у меня есть:

DetachedCriteria criteria = DetachedCriteria.forClass(Business.class)
.setProjection(Property.forName("area"))
.setProjection(Property.forName("area2"))
.add(Restrictions.ne("code", null));

Criteria criteriaArea = fullTextSession.createCriteria(Area.class)
.createAlias("areaId", "areaId", CriteriaSpecification.LEFT_JOIN)
.add(Property.forName("areaId").in(criteria));

Но это не работает, я получаю исключение запроса "not association: areaId".

Любые идеи, почему это происходит?Спасибо.

1 Ответ

5 голосов
/ 13 февраля 2011

createAlias() присоединяется к другому объекту, используя предоставленное свойство.Hibernate рассчитывает, к какой таблице присоединиться, используя сопоставление предоставленного свойства.Но areaId не отображается как ссылка @ManyToOne или @ManyToMany на бизнес-объект.Таким образом, Hibernate не понимает, к какой таблице вы хотите присоединиться, используя Area.areaId.

Ваши критерии будут переведены в SQL, например:

select a.* from Area a
left join <here should be table referenced by areaId> b on a.areaId = b.id
where a.areaId in (
  select area, area2 from Business where code <> null
)

Вы можете переписать запрос без неиспользованного объединения:

DetachedCriteria criteria1 = DetachedCriteria.forClass(Business.class)
.setProjection(Property.forName("area"));

DetachedCriteria criteria2 = DetachedCriteria.forClass(Business.class)
.setProjection(Property.forName("area2"));

Criteria criteriaArea = fullTextSession.createCriteria(Area.class)
.add(Restrictions.or(
  Property.forName("areaId").in(criteria1),
  Property.forName("areaId").in(criteria2)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...