2

我正在使用org.hibernate.criterion.Example.create从我的 Entity 对象创建查询。一切都很好,但是使用这种方法只能在限制之间使用 AND 子句创建 SQL。

是否可以使用org.hibernate.criterion.Example.create但带有 OR 子句?

4

3 回答 3

1

简短的回答是不,你不能这样做,但你可以实现 a OrExample,这很容易,只需检查源代码Example并更改andfor 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.

于 2014-07-24T02:42:08.250 回答
1

来自 SO 的旧帖子可能会有所帮助:Hibernate Criteria Restrictions AND / OR combination

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));
于 2014-07-24T02:44:21.010 回答
1

是的你可以

session.createCriteria(Person.class) .add(Restrictions.disjunction() .add(Restrictions.eq("name", "James")) .add(Restrictions.eq("age", 20)) );

在上面的示例中,类 Person 将具有属性 name 和 age,您将选择 name = "James" 或 age = 20 的人。

于 2014-07-24T02:29:45.877 回答