一、基本使用
1. 说明Restrictions 是产生查询条件的工具类。2. 定义可以直接用class 创建DetachedCriteria searDc =DetachedCriteria.forClass(QymlPerson.class);也可以用hibernate 的session 创建session.createCriteria(Student.class)3. 条件查询3.1 多条件的and 规则
通过searDc.add(Restrictions.eq("unid", userid))实现条件查询。多次添加的条件,默认的规则是and.
3.2 多条件的or 规则
如果实现or 的查询,需要按照如下方式进行searDc.add(Restrictions.or(Restrictions.eq("deptunid", "aa"),Restrictions.isNull("deptunid")));其中isnull 表示一个常规字段是否为空,isEmpty 用来表示一个集合字段是否为空。
4. 查询排序通过searDc.addOrder(Order.asc(propertyName1))可以添加排序,如果有多个排序字段,可以添加多次;最终的结果将按照添加的次序进行排序处理。
二、子查询
//主查询:人员查询DetachedCriteria searDc =DetachedCriteria.forClass(QymlPerson.class);//子查询:职务人员关系表DetachedCriteria sub =DetachedCriteria.forClass(QymlPositionUserLink.class);sub.add(Restrictions.eq("positionunid", positionunid));//子查询:指定查询的列(也就是select usernuid from ....)sub.setProjection(Property.forName("userunid"));//主查询和子查询关联(也就是where unid in (select userunid from...) )searDc.add(Property.forName("unid").in(sub));在上面的例子中,用个一个类似于下面SQL 的子查询Select * from Person a where a.unid in (select userunid from PositionUserLink b whereb.positionunid = ..)Property 还有其他的条件判断,参考apihttp://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/criterion/Property.html。
三、Restrictions表达式
HQL运算符 QBC运算符 含义= Restrictions.eq() 等于equal<> Restrictions.ne() 不等于 not equal> Restrictions.gt() 大于greater than>= Restrictions.ge() 大于等于 greater than or equal< Restrictions.lt() 小于less than<= Restrictions.le() 小 于 等 于 less than or equalis null Restrictions.isnull() 等于空值is not null Restrictions.isNotNull() 非空值like Restrictions.like() 字符串模式匹配and Restrictions.and() 逻辑与and Restrictions.conjunction() 逻辑与or Restrictions.or() 逻辑或or Restrictions.disjunction() 逻辑或not Restrictions.not() 逻辑非in(列表) Restrictions.in() 等于列表中的某一个值not in(列表) Restrictions.not(Restrictions.in()) 不等于列表中任意一个值between x and y Restrictions.between() 闭区间 xy中的任意值not between x and y Restrictions.not(Restrictions..between()) 小于值X 或者大于值y
四、Restrictions关联查询
如果每个美女都有自己的客户资源(不要想歪了!),那么需要查询拥有客户Gates的美女怎么办?
使用Criteria可以有两种方法:
1: DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createCriteria("customers");
beautyCriteria.add(Restrictions.eq("name", "Gates")):2: DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createAlias("customers", "c");beautyCriteria.add(Restrictions.eq("c.name", "Gates")):接着有了新的要求,年纪太大的美女不要,还是查找拥有客户Gates的,条件如下:DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class, "b").;DetachedCriteria customerCriteria = beautyCriteria.createAlias("customers", c");beautyCriteria.add(Restrictions.le("b.age", new Long(20))):customerCriteria.add(Restrictions.eq("c.name", "Gates")):