Java Hibernate org.Hibernate.criteria.Example.create或子句
我正在使用从实体对象创建查询。一切都很好,但使用此方法,SQL仅在限制之间使用AND子句创建 可以使用but with OR子句吗?可以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
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));