如何在hibernate中使用AND OR运算符分离条件查询

时间:2010-11-25 22:06:32

标签: hibernate

我需要使用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方法,只是在那里添加。

提前致谢

2 个答案:

答案 0 :(得分:10)

使用Restrictions.conjunction()Restrictions.disjunction()创建条件层次结构。

查看here - section 15.2here


编辑:

我认为你的代码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:全部。