我正在使用org.hibernate.criterion.Example.create从我的 Entity 对象创建查询。一切都很好,但是使用这种方法只能在限制之间使用 AND 子句创建 SQL。
是否可以使用org.hibernate.criterion.Example.create但带有 OR 子句?
我正在使用org.hibernate.criterion.Example.create从我的 Entity 对象创建查询。一切都很好,但是使用这种方法只能在限制之间使用 AND 子句创建 SQL。
是否可以使用org.hibernate.criterion.Example.create但带有 OR 子句?
简短的回答是不,你不能这样做,但你可以实现 a OrExample
,这很容易,只需检查源代码Example
并更改and
for 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
.
来自 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));
是的你可以
session.createCriteria(Person.class) .add(Restrictions.disjunction() .add(Restrictions.eq("name", "James")) .add(Restrictions.eq("age", 20)) );
在上面的示例中,类 Person 将具有属性 name 和 age,您将选择 name = "James" 或 age = 20 的人。