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持久层封装(二)》