2015-11-06 3 views
0
  • My Hibernate bean ContentElementTypeProperty ссылается на другой тестовый экземпляр Hibernate Bean TestUnitType (много к одному).
  • TestUnitType - это поле ContentElementTypeProperty.
  • В базе данных testunittypeid есть столбец в таблице contentelementtypeproperty.

Я ищу, чтобы получить все строки из contentelementtypeproperty ГДЕ testunittypeid является нулевым или testunittypeid = [дано Длинные значение]Ограничение критериев гибернации по столбцу объединения

Способ, показанный ниже, возвращает 0 результатов.

Однако, если я удалю: либо

.add(Restrictions.isNull("testUnitType")); 

или

cr.createCriteria("testUnitType") 
       .add(Restrictions.eq("id", tutId)); 

я получаю результаты (но явно не все строки, мне нужно).

Как объединить эти два так, чтобы они выполняли критерии ИЛИ, каждый из которых создается под отдельным вызовом createCriteria?

@Transactional(propagation = Propagation.MANDATORY) 
public List<ContentElementTypeProperty> getContentElementTypePropertiesForTut(Long businessId, Long tutId) 
     throws TestStructureException 
{ 
    SS.getLogger().debug("getContentElementTypePropertiesForTut business id:"+businessId +" tutid: "+tutId); 
    try 
    { 

     Session session = this.sessionFactory.getCurrentSession(); 

     Criteria cr = session.createCriteria(ContentElementTypeProperty.class) 
       .add(Restrictions.isNull("testUnitType")); 
     cr.createCriteria("testUnitType") 
       .add(Restrictions.eq("id", tutId)); 

     cr.createCriteria("business").add(Restrictions.eq("id", businessId)); 

     List<ContentElementTypeProperty> result = cr.list(); 
     SS.getLogger().debug("getContentElementTypePropertiesForNullTutOnly result size:"+result.size()); 
     return result; 
    } 
    catch (Exception e) 
    { 
     SS.getLogger().error(e.getMessage(), e); 

     throw new TestStructureException(e); 
    } 
} 

UPDATE После консультации с Malagunna, я попытался с помощью критерия (ниже). Однако это возвращает строки для crAux2.

 Criteria cr = session.createCriteria(ContentElementTypeProperty.class); 


    cr.createAlias("testUnitType", "tut"); 

    Criterion crAux1 = Restrictions.isNull("testUnitType"); 
    Criterion crAux2 = Restrictions.eq("tut.id", tutId); 

    cr.add(Restrictions.or(crAux1, crAux2)); 

ответ

1

Я считаю, что ваша проблема заключается в том, что вы не используете DISJUNCTION для объединения обоих ограничений.

Попробуйте это:

.... 
Session session = this.sessionFactory.getCurrentSession(); 

//Here it starts my solution 
Criteria cr = session.createCriteria(ContentElementTypeProperty.class); 

Criterion crAux1 = Restrictions.isNull("testUnitType"); 
Criterion crAux2 = cr.createCriteria("testUnitType") 
    .add(Restrictions.eq("id", tutId)); 

cr.add(Restrictions.or(crAux1, crAux2)); 
//Here it ends my solution 

cr.createCriteria("business").add(Restrictions.eq("id", businessId)); 
.... 

Я не совсем уверен, что crAux2 я предпочел бы, чтобы проверить это раньше, но если это не сработает, то я хотел бы создать первый псевдоним testUnitType, а затем переписать crAux2 в

Criterion crAux2 = Restrictions.eq("alias.id", tutId); 

Edit

Я был перечитывая критерии Hibernate документ и, возможно, этот подход г esolved проблемы:

createAlias("mate", "mt", Criteria.LEFT_JOIN, Restrictions.like("mt.name", "good%")); 

Этот образец был взят непосредственно из Hibernate документации и в нем говорится буквально:

Это будет возвращать все кошки с помощником, имя которого начинается с «хорошо» по заказу возраст их мате и всех кошек, у которых нет помощника.

Итак, что сказал, я думаю, вы могли бы изменить свой метод так:

.... 
Session session = this.sessionFactory.getCurrentSession(); 

//Here it starts my solution 
Criteria cr = session.createCriteria(ContentElementTypeProperty.class); 

cr.createCriteria("testUnitType", "tut", Criteria.LEFT_JOIN, Restrictions.eq("tut.id", tutId));  
//Here it ends my solution 

cr.createCriteria("business").add(Restrictions.eq("id", businessId)); 
.... 

Это более простой, и это означает то же самое, что дизъюнкция образец.

Надеюсь, это поможет!

+0

Malaguna, это перемещает меня в правильном направлении, благодаря миллиону. Однако crAux2 имеет ошибку компиляции «Невозможно преобразовать из критерия в критерий» – Jake

+0

Он скомпилировался с использованием метода псевдонима, но теперь возвращает строки только из crAux2 – Jake

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