QBC就是Query By Criteria 。QBC是Hibernate提供的几种检索方式之一。
(一)这里先小做一个总结:Hibernate检索对象的方式有哪些呢?
(1)导航对象图检索方式。根据已经加载的对象,导航到其他对象。比如:对于已经加载的班级对象class1.调用它的getStudents()方法,就可以导航到所有关联的Student对象。
(2)OID检索方式。根据对象的OID来检索对象,Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。
(3)HQL检索方式。这种方法大家一定不陌生。我们使用Hibernate提供的Query接口,能够执行各种复杂的的HQL查询语句。
(4)本地SQL检索方式。使用SQL语句查询,Hibernate负责把检索到的JDBC ResultSet结果集映射为持久化对象图。
(5)QBC检索方式,就是本篇博客要介绍的。
(二)QBC主要由org.hibernate.Criteria接口、org.hibernate.criterion.Criterion接口和org.hibernate.criterion.Restrictions类组成,支持运行时动态生成查询语句。
我们先看一段我写过的一段代码:
/**
* 多条件查询月报问题列表 wyj2015年6月23日
* @param page Coordinate分页实体
* @param entity
* @param userId 用户Id
* @param tabstatus
* @param reportdateStr 月报日期
* @param objArray
* @param deptId 部门Id
* @status 办理状态;未分配职责部门,在办,建议办结,办结和退回
* @return Coordinate分页实体
*/
public Page<Coordinate> getObjectsByConditions(Page<Coordinate> page, Coordinate entity,
String userId, String tabstatus,String reportdateStr,Object[] objArray,Long deptId,String status,boolean flag) {
page.setOrderBy("reportdate");
page.setOrder("desc");
Criteria critera = dao.getSession().createCriteria(Coordinate.class);
critera.add(Restrictions.eq("delflag", 1));
if(null != objArray && objArray.length>0){
critera.createAlias("projectinfo", "projectinfo");
critera.add(Restrictions.in("projectinfo.id",objArray));
}
if(null!=entity.getReporter() && entity.getReporter().trim().length()>0 ){
critera.add(Restrictions.like("reporter", "%"+entity.getReporter().trim()+"%"));
}
if (null!=entity.getContent() && entity.getContent().trim().length()>0) {
critera.add(Restrictions.like("content", "%"+entity.getContent().trim()+"%"));
}
//筛选的发布时间
if(null != reportdateStr && reportdateStr.trim().length()>0 ){
String[] strs = reportdateStr.split("-");
String year =strs[0] ;
String month=strs[1];
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, Integer.parseInt(year));
cal.set(Calendar.MONTH, Integer.parseInt(month)-1);
cal.set(Calendar.DATE, Integer.parseInt("1"));
Calendar calend = Calendar.getInstance();
calend.set(Calendar.YEAR, Integer.parseInt(year));
calend.set(Calendar.MONTH, Integer.parseInt(month));
calend.set(Calendar.DATE, Integer.parseInt("1"));
critera.add(Restrictions.between("reportdate",cal.getTime(), calend.getTime()));
}
//增加判断条件status.如果为0,查询所有为分配职责部门的记录 wyj 2015年6月23日
if(null != status && status.trim().length()>0){
critera.add(Restrictions.eq("status", status));
}
if(null != deptId && deptId >0){
if(flag == true){
critera.createAlias("reportDept", "reportDept");
critera.add(Restrictions.eq("reportDept.id", deptId));
}else{
critera.createAlias("dutyDept", "dutyDept");
critera.add(Restrictions.eq("dutyDept.id", deptId));
}
}
return dao.findByCriteria(page, critera);
}
根据这段代码总结一下QBC检索方式包括以下步骤:
(1)调用Session接口的createCriteria()方法创建一个Criteria对象。
(2) 设定查询条件。Restrictions类提供了一系列用于设定查询条件的静态方法,这些方法都返回Criterion实例,每个Criterion实例代表一个查询条件。Criteria接口的add()方法用于加入查询条件。
我列举几个最最常用的Restrictions方法:
Restrictions.between --> 对应SQL的between子句
Restrictions.like --> 对应SQL的LIKE子句
Restrictions.in --> 对应SQL的in子句
Restrictions.eq --> equal,等于.
同一类得还有(以下四个)
Restrictions.gt --> great-than > 大于
Restrictions.ge --> great-equal >= 大于等于
Restrictions.lt --> less-than, < 小于
Restrictions.le --> less-equal <= 小于等于
(3)调用Criteria接口的list()方法执行查询语句。该方法返回List类型的查询结果。
除此之外,Criteria对象可以对查询结果排序。采用Order类。如下:
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("age"));
还可以支持分页查询。如下:
criteria.setFirstResult(2);
criteria.setMaxResults(5);
如果记录集中有5条数据,那么可以查询出2.3.4.5条数据。
总结:QBC的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件。然后返回匹配的对象。如果采用HQL,必须创建冗长的字符串形式的HQL查询语句。
而且QBC查询可以使代码更加简洁,更容易上手。