Hibernate之QBC
         QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。
一真都是使用Hibernate的QBC来对操作数据 ,对持久层DaoTemplate做了一些封装;
不善言语表达,直接放代码,字数原因不提供GET SET
多条件查询类:
package com.peak.dao.util;
import org.hibernate.criterion.Criterion;
/**
 * 基础多条件查询条件
 * */
public class MyWhere {
    /**查询参数名*/
    private String propertyName;
    /**查询条件*/
    private Compare compare = Compare. EQ;
 
    /**查询参数值*/
    private Object propertyValue;
    /**between值*/
    private Object[] betweenValue;
 
    /**and_or条件1[Restrictions.eq(propertyName,propertyValue]*/
    private Criterion lhs;
    /**and_or条件2[Restrictions.eq(propertyName,propertyValue]*/
    private Criterion rhs;//and条件2
    }
 
    public MyWhere(String propertyName, Compare compare, Object propertyValue) {
        super();
        this.propertyName = propertyName;
        this.compare = compare;
        this.propertyValue = propertyValue;
    }
   
   
}
 
 
查询方式:
package com.peak.dao.util;
 
/**
 * 查询方式
 * @author peak * */
public enum Compare {
    /**等于*/
    EQ,
   
    /**不等于*/
    NE,
   
    /**小于*/
    LT,
   
    /**大于*/
    GT,
   
    /**小于等于*/
    LE,
   
    /**大于等于*/
    GE,
   
    /**像*/
    LIKE,
   
    IN,
   
    /**在...范围之内*/
    BETWEEN,
   
    /**并且*/
    AND,
   
    /**或者*/
    OR;
   
   
}
 
多表抓取连接类:
package com.peak.dao.util;
 
/**
 * 多表查询链接条件
 * @author peak *
 * */
public class LinkCondition {
    /**属性名*/
    private String propertyName;
    /**别名*/
    private String propertyAlias;
 }
 
查询结果排序类:
 
package com.peak.dao.util;
 
import java.io.Serializable;
 
/**
 * 基础多条件查询条件
 * @author peak *
 * */
public class Order implements Serializable {
   
    /**
     *
     */
    private static final long serialVersionUID = 1L;
 
    /**需要排序的属性*/
    private String fieldName;
   
    /**属性排序方式*/
    private OrderDirect direct = OrderDirect. ASC;
   
   
  }
查询结果排序方式:
package com.peak.dao.util;
 
/**
 * 排序方式
 * @author peak *
 * */
public enum OrderDirect {
    /**升序*/
    ASC,
    /**降序*/
    DESC;
}
 
 
用于分组查询类:
package com.peak.dao.util;
 
import java.util.HashMap;
import java.util.Map;
 
public class GroupBy {
 
// 
// private String groupProperty;
// private String groupAlia;
   
    /**须要分组的属性*/
    private Map<String, String> group = new HashMap<String, String>(0);//分组属性
   
    /**分组后放聚合函数查询属性 */
    private FunctionDemand[] functionDemands;//
   
      
}
 
分组条件:
 
package com.peak.dao.util;
 
 
/**
 * 分组使用聚合函数查询的字段
 * @author peak  *
 *
 * */
public class FunctionDemand {
   
    /**放到聚合函数查询的属性*/
    private String pro;
   
    /**使用的聚合函数*/
    private Function fun;
 
    /**属性别名*/
    private String alia;
 
   }
 
 
分组所使用的函数:
 
package com.peak.dao.util;
 
/**
 * 分组函数
 * @author peak  *
 * */
public enum Function {
   
    /**平均值*/
    AVG,
    /**总条数*/
    COUNT,
    /**最大值*/
    MAX,
    /**最小值*/
    MIN,
    /**总和*/
    SUM
   
}
 
 
分页信息:
package com.peak.dao.util;
 
/**
 * 分页条件
 * @author peak  *
 * */
public class Pager {
    /**分页的当前页数*/
    private int pageIndex=1;
   
    /**每页页大小*/
    private int pageSize=10;
   
    /**总页数*/
    private int pageCount;
   
    /**查询总条数*/
    private int recordCount;
   
   
   }
 
最终传入DaoTemplate 的查询条件,综合条件、分页、多表连接以及分组、排序等:
package com.peak.dao.util;
 
import java.io.Serializable;
 
 
/** @author
 * 基础查询条件
 * peak  *
 * */
 
public class Condition implements Serializable {
   
   
    /**
     *
     */
    private static final long serialVersionUID = 1L;
 
    /**
     * 基础查询条件
     * */
    private MyWhere[] myWheres;
   
    /**连接条件*/
    private LinkCondition[] linkCondition;
   
    /**分页条件*/
    private Pager pager;
   
   
    /**排序条件*/
    private Order order;
   
    /**
     * 分组查询条件
     * */
    private GroupBy groupBy;
   
  }
 
 
查询返回结果集,其中包括数据结果List与分页信息:
package com.peak.dao.util;
 
import java.util.List;
 
/**
 * 查询结果集
 * @author peak * */
public class ResultList {
    /**返回的查询结果集合*/
    private List list;
   
    /**返回分页结果*/
    private Pager pager;
   
    public List getList() {
        return list;
    }
    public void setList( List list) {
        this.list = list;
    }
    public Pager getPager() {
        return pager;
    }
    public void setPager(Pager pager) {
        this.pager = pager;
    }
    public ResultList( List list, Pager pager) {
        super();
        this.list = list;
        this.pager = pager;
    }
    public ResultList() {
        super();
    }
 
   
   
}
 
DaoTemplate类,使用这个类首页需要在spring文件中向HibernateTemplate注入SessionFactory,再将HibernateTemplate注入到DaoTemplate中使用:
 接下文章见《Hibernate之QBC持久层封装(二)》