Предложение 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));
Другие вопросы по тегам