Java Hibernate org.Hibernate.criteria.Example.create或子句

Java Hibernate org.Hibernate.criteria.Example.create或子句,java,hibernate,criteria,query-by-example,criterion,Java,Hibernate,Criteria,Query By Example,Criterion,我正在使用从实体对象创建查询。一切都很好,但使用此方法,SQL仅在限制之间使用AND子句创建 可以使用but with OR子句吗?可以 session.createCriteria(Person.class) .add(Restrictions.disjunction() .add(Restrictions.eq("name", "James")) .add(Restrictions.eq("age", 20)) ); 在上面的示例中,类Person将具有name和age属性,您将选择nam

我正在使用从实体对象创建查询。一切都很好,但使用此方法,SQL仅在限制之间使用AND子句创建

可以使用but with OR子句吗?

可以

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

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

简短的回答是不,您不能这样做,但您可以实现一个
或示例,这非常简单,仅检查
示例的源代码
,并更改
(参见第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);
    }

请参阅
而不是原始的

SO的旧帖子可能会有所帮助:


这可能会对您有所帮助:问题在于如何将
示例
类与
一起使用,而不是如何创建标准。正如@AVolpe所说的那样。该问题与示例相关。该问题是关于将
示例
类与
一起使用,而不是创建或使用标准。
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));