Спящий режим — дизъюнкция с критерием. Пример в QBE

Я хочу выполнить поиск в моей базе данных по критерию. Пример в нескольких полях, объединенных по ИЛИ. То есть я хочу получить записи, в которых «поле1» является примером моего объекта поиска ИЛИ «поле2» является примером моего объекта поиска, где поле1 и поле2 являются дочерними элементами объекта верхнего уровня, и каждый из них имеет один и тот же тип. как мой объект поиска.

Что я хотел бы сделать, это

 Disjunction or = Restrictions.disjunction(); 
 or.add(criteria.createCriteria("field1").add(searchObj));
 or.add(criteria.createCriteria("field2").add(searchObj)); 
 criteria.add(or); 

Что не работает, потому что дизъюнкции работают только с критериямиon, а не с критериямиa.

Я старался

 Disjunction or = Restrictions.disjunction(); 
 or.add(Restrictions.eq("field1", searchObj));
 or.add(Restrictions.eq("field2", searchObj));
 criteria.add(or); 

Но это дало мне исключение PropertyAccessException для первичного ключа объекта, говоря:

 IllegalArgumentException occurred calling getter of [.....].pk

Есть ли способ сделать QBE с дизъюнкцией между пунктами примера?


person DFL    schedule 03.01.2017    source источник


Ответы (1)


Я решил это, используя DetachedCriteria и подзапросы:

DetachedCriteria f1Crit = DetachedCriteria.forClass(SearchObj.class, "field1");
f1Crit.add(searchObj); 
f1Crit.setProjection(Property.forName("id"));

DetachedCriteria f2Crit = DetachedCriteria.forClass(SearchObj.class, "field2");
f2Crit.add(searchObj); 
f2Crit.setProjection(Property.forName("id"));

criteria.add(
    Restrictions.or(
        Subqueries.propertyIn("field1.id", f1Crit),
        Subqueries.propertyIn("field2.id", f2Crit))
    ); 
person DFL    schedule 05.01.2017