Как использовать критерии гибернации для левого внешнего соединения без прямой ссылки на две таблицы - PullRequest
3 голосов
/ 01 октября 2009

Я пытаюсь перевести квест SQL в критерии Hibernate.

Мой квест работает в SQL:

    select * from objective 
    left outer join conditionstate 
      on objective.conditionid = conditionstate.conditionid 
         and conditionstate.personid = XXXX 
    where objective.toto_id = YYYYY 

Цель не отображается непосредственно в состояние_состояния, а в условие.

objective --> condition <-- condition_state

Я тестировал что-то вроде:

    final DetachedCriteria criteriaObjective = 
       DetachedCriteria.forClass(Objective.class);
    criteriaObjective.createAlias("conditionState", "conditionState", Criteria.LEFT_JOIN);

безуспешно ..

1 Ответ

1 голос
/ 01 октября 2009

Трудно что-то предложить, не видя ваших реальных отображений. Исходя из вашего объяснения и предполагая, что условие и conditionState отображаются как многие-к-одному, вы должны написать что-то вроде:

final DetachedCriteria criteriaObjective = 
  DetachedCriteria.forClass(Objective.class);
criteriaObjective
  .createCriteria("condition", Criteria.LEFT_JOIN)
  .createCriteria("conditionState", Criteria.LEFT_JOIN)
  .add(Restrictions.eq("personid", "XXXX") );
criteriaObjective.add(Restrictions.eqProperty("toto_id", "YYYY") );

Обратите внимание, что вышеприведенное НЕ эквивалентно предоставленному вами SQL-запросу, потому что условие "personid" будет сгенерировано как часть предложения "WHERE". Насколько я знаю, невозможно выполнить левое соединение с условием, используя Criteria API - вместо этого вам может понадобиться использовать HQL, который предоставляет с ключевым словом для этой конкретной цели:

select o from objective as o
  left join o.condition as c
  left join c.conditionState as cs
  with cs.person_id = 'XXXX'
  and o.toto_id = 'YYYY'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...