Предложение Hibernate org.hibernate.criterion.Example.create OR
Я использую org.hibernate.criterion.Example.create для создания моего запроса из моего объекта Entity. Все хорошо, но с помощью этого метода SQL создается только с условием AND между ограничениями.
Можно ли использовать org.hibernate.criterion.Example.create, но с предложением OR?
3 ответа
Короткий ответ: нет, вы не можете сделать это, но вы можете реализовать OrExample
, это довольно легко, только проверить исходный код Example
и изменить and
за or
(см. строку исходного кода 329). Так как методы защищены, вы можете расширить его и переопределить только необходимый.
Что-то вроде этого:
public class OrExample extends org.hibernate.criterion.Example {
@Override
protected void appendPropertyCondition(
String propertyName,
Object propertyValue,
Criteria criteria,
CriteriaQuery cq,
StringBuffer buf)
throws HibernateException {
Criterion crit;
if ( propertyValue!=null ) {
boolean isString = propertyValue instanceof String;
if ( isLikeEnabled && isString ) {
crit = new LikeExpression(
propertyName,
( String ) propertyValue,
matchMode,
escapeCharacter,
isIgnoreCaseEnabled
);
}
else {
crit = new SimpleExpression( propertyName, propertyValue, "=", isIgnoreCaseEnabled && isString );
}
}
else {
crit = new NullExpression(propertyName);
}
String critCondition = crit.toSqlString(criteria, cq);
if ( buf.length()>1 && critCondition.trim().length()>0 ) buf.append(" or ");
buf.append(critCondition);
}
Увидеть or
вместо оригинала and
,
Да, ты можешь
session.createCriteria(Person.class) .add(Restrictions.disjunction() .add(Restrictions.eq("name", "James")) .add(Restrictions.eq("age", 20)) );
В приведенном выше примере класс Person будет иметь свойства name и age, и вы будете выбирать людей с name = "James" или age = 20.
Может пригодиться старый пост от SO: Критерии Hibernate Ограничения И / ИЛИ сочетание
Criteria criteria = getSession().createCriteria(clazz);
Criterion rest1= Restrictions.and(Restrictions.eq("A", "X"),
Restrictions.in("B", Arrays.asList("X","Y")));
Criterion rest2= Restrictions.and(Restrictions.eq("A", "Y"),
Restrictions.eq("B", "Z"));
criteria.add(Restrictions.or(rest1, rest2));