2013-09-25 2 views
0

Как можно предоставить предложение OR в LEFT_JOIN в спящих критериях.Предложение OR в LEFT_JOIN в спящем режиме

Criteria mainCrit=hibernateSession.createCriteria("Main.class");  
Criteria aPropertyCrit=mainCrit.createCrieria("child",CriteriaSpecification.LEFT_JOIN); 

Он генерирует SQL как

select this_.Id,this_childId.... 
from main as this_ 
left join child as child1_ on child1_ .id=this_.childId 
where..... 

И мне нужно генерировать SQL как

select this_.Id,this_childId.... 
from main as this_ 
left join child as child1_ on child1_.id=this_.childId or child_.ParentId=this_.childId 
where..... 

Как обеспечить или условие в LEFT_JOIN в указанных выше критериев.

+0

Для этого вы можете использовать слияние с гибернацией/дизъюнкцию. – Zeus

+0

Вы когда-нибудь смогли это решить? если да, пожалуйста, поделитесь возможным решением –

ответ

0

Расширение части JOIN ... ON может быть выполнено даже с помощью API критериев. Но только для того, чтобы быть более ограничительным, то есть с добавлением части и.

Посмотрите на перегрузках createCriteria метода, в основном, последний параметром withClause:

Criteria createCriteria(String associationPath, 
         String alias, 
         JoinType joinType, 
         Criterion withClause) 
         throws HibernateException 

Создать новый критерий, «укорененные» в соответствующей сущности, назначая данный псевдоним и с помощью указанный тип соединения.

Параметры:

  • associationPath - Точка-отделено путь свойства
  • псевдоним - псевдоним для назначения объединенной ассоциации (для дальнейшего использования).
  • joinType - тип соединения для использования.
  • withClause - Критерии, которые будут добавлены к условию соединения (ON п)

В самом деле, любой другой подход (например, добавление к OR), нарушает отображение основной, представляя способность чтобы перекрестное соединение было в конце. см. Hibernate criteria: Joining table without a mapped association

+0

Критерии mainCrit = hibernateSession.createCriteria («Main.class», «main»); Критерии aPropertyCrit = mainCrit.createCrieria («child», «child», JoinType.LEFT_OUTER_JOIN, Restrictions.eqProperty («main.childid», «child.parentid»)); Теперь он вставляет левое внешнее дочернее дочернее соединение child_ на this_.childid = child_.Id и (this_.SectionId = child_.parentId). И я хотел бы предложение OR вместо AND в сгенерированном sql. – pinkb

+1

В первом абзаце я объясняю, что единственный способ, как работать с JOIN ... ON - с ** AND **. Для OR нет поддержки, поскольку это нарушит отображение и реальность. Это правильное поведение ORM –

+0

Итак, как мне достичь результата, который я хотел. Думаю, теперь я попытаюсь сделать это с помощью DetachedCriteria. Любые входы с вашего конца будут высоко оценены. – pinkb

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