我需要使用AND / OR运算符来休眠分离的条件查询。 我想模拟SQL等效于:
Select * from myTable where city in ( X, Y ) OR city in (A,B);
//注意我需要在这里使用多个'In'
如何创建citeria查询以使用'OR'运算符。
像
这样的东西DetachedCriteria criteria = DetachedCriteria.forClass(
myClass.class)
.add(Property.forName("city").in(X,Y));
criteria.**Or**(add(Property.forName("city").in(X,Y));
不幸的是,标准中没有OR方法,只是在那里添加。
提前致谢
答案 0 :(得分:10)
使用Restrictions.conjunction()
和Restrictions.disjunction()
创建条件层次结构。
编辑:
我认为你的代码Property.forName("city").in(X,Y))
是正确的(我不记得这个clausule)
DetachedCriteria criteria = DetachedCriteria.forClass(
myClass.class)
.add(Restrictions.disjunction()
.add( Property.forName("city").in(X,Y) )
.add(Property.forName("city").in(X,Y) )
);
答案 1 :(得分:3)
执行以下步骤:
步骤1.0:创建查询标准
Criteria myQueryCrit = session.createCriteria(XYZ.class, "xyz");
步骤2.0:处理查询的OR条件:
2.1)首先你需要创建Disjunction对象,比如myQueryDisjunc。
Disjunction myQueryDisjunc = Restrictions.disjunction();
2.2)然后创建All OR Criterion对象。像:
Criterion xyzName = Restrictions.ilike("xyz.name", "%"+searchStr1+"%", MatchMode.ANYWHERE);
Criterion xyzSpeciality = Restrictions.ilike("xyz.specs", "%"+searchStr1+"%", MatchMode.ANYWHERE);
Criterion xyzServices = Restrictions.ilike("xyz.services", "%"+searchStr1+"%", MatchMode.ANYWHERE);
2.3)将所有OR Criterions对象添加到myQueryDisjunc
myQueryDisjunc.add(xyzName);
myQueryDisjunc.add(xyzSpeciality);
myQueryDisjunc.add(xyzServices);
步骤3.0:处理和查询条件:
3.1)首先你需要创建Conjunction对象,比如myQueryConjunc。
Conjunction myQueryConjunc = Restrictions.conjunction();
3.2)然后创建All AND Criterion对象。像:
Criterion xyzLoc = Restrictions.ilike("xyz.locStr", "%"+searchStr2+"%", MatchMode.ANYWHERE);
Criterion xyzZip = Restrictions.ilike("xyz.zipStr", "%"+searchStr3+"%", MatchMode.ANYWHERE);
3.3)将所有AND Criterions对象添加到myQueryConjunc
myQueryConjunc.add(xyzLoc);
myQueryConjunc.add(xyzZip);
Step-4.0:现在将myQueryDisjunc,myQueryConjunc添加到myQueryCrit中:
myQueryCrit.add(myQueryDisjunc);
myQueryCrit.add(myQueryConjunc);
步骤-5.0:现在添加任何结果Trnasformer(如果需要)[可选]:
myQueryCrit.setResultTransformer(
CriteriaSpecification.DISTINCT_ROOT_ENTITY);
Step-6.0:执行myQueryCrit,在其上调用list()。
List <myObj> allResults = myQueryCrit.list();
Step-7.0:全部。