[TOC]
# QBC(query by criteria)
QBC(query by criteria),它是一种更加面向对象的检索方式。
org.hibernate.criterion.Criterion是Hibernate提供的一个面向对象查询条件接口.一个单独查询就是Criterion接口的一个实例,用于限制Criteria对象的查询,在Hibernate中Criterion对象的创建通常是通过Restrictions工厂类完成的
具体如下:
1. 获得 Hibernate的 Session对象。
2. 通过 Session获得 Criteria对象。
3. 使用 Restrictions的静态方法创建 Criterion条件对象。 Restrictions类中提供了一系列用于
设定查询条件的静态方法,这些静态方法都返回 Criterion实例,每个 Criterion实例代表
个查询条件。
4. 向 Criteria对象中添加 Criterion查询条件。 Criteria的add()方法用于加入查询条件
5. 执行 Criteria的list()或uniqueresult()获得结果
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
## 基本检索
~~~
//1. 得到一个Criteria对象
Criteria criteria = session.createCriteria(Goods.class);
//2. 调用list方法
List list = criteria.list();
System.out.println(list);
~~~
## 排序检索
**注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象**
~~~
//得到一个Criteria对象
Criteria criteria = session.createCriteria(Goods.class);
//指定排序
criteria.addOrder(org.hibernate.criterion.Order.asc("money")); //asc升序, desc降序
//调用list方法
List list = criteria.list();
System.out.println(list);
~~~
## 条件检索
~~~
hql语句中,不能出现任何数据库相关的信息
> gt
>= ge
< lt
<= le
== eq
!= ne
in in
between and between
like like
is not null isNotNull
is null isNull
or or
and and
~~~
~~~
//查询名称叫 手机的 商品
Criteria criteria = session.createCriteria(Goods.class);
//其他条件 lt , le <=, ge >=, eq ==
Criterion like = Restrictions.like("name", "手机_");
//添加条件
criteria.add(like);
Goods c = (Goods) criteria.uniqueResult();
System.out.println(c);
//查询价格在1050以上,并且名称叫 手机的 商品
Criteria cri = session.createCriteria(Goods.class);
// >1050
SimpleExpression lt = Restrictions.gt("money", 1050d);
SimpleExpression eq = Restrictions.eq("c", c);
LogicalExpression and = Restrictions.and(lt, eq);
cri.add(and);
//List list = cri.add(Restrictions.and(
// Restrictions.gt("money", 1050d),
// Restrictions.eq("c", c)
//)).list();
~~~
## 分页检索
~~~
Criteria criteria = session.createCriteria(Goods.class);
criteria.setFirstResult((2 - 1) * 6);
criteria.setMaxResults(6);
List list = criteria.list();
System.out.println(list);
~~~
## 统计分组检索
`Count sum avg max min`
~~~
//1. 统计订单总数
Criteria criteria = session.createCriteria(Goods.class);
//Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult();
//统计总行数 count(id)
//System.out.println(obj);
//2. 订单的总价格---分组统计根据客户
//criteria.setProjection(Projections.sum("money")); //统计总金额
criteria.setProjection(
Projections.projectionList().add(
Projections.sum("money"))
.add(Projections.groupProperty("c")
)
);
//这个集合保存的是Object[money的统计信息,客户信息]
List list = criteria.list();
~~~
## 离线条件检索
在多条件查询的时候,需要在Web层封装相应的参数到Criteria,
而在Dao层才真正的去执行查询数据库的操作,
所以需要在Web层创建Criteria并将其传递到Dao层,
这个时候就不能在Web层使用session.createCriteria来创建Criteria,
因为Criteria的一般创建都是使用session.createCriteria(),
而session都是在Dao层才会创建的
~~~
//1. 得到DetachedCriteria
DetachedCriteria dc = DetachedCriteria.forClass(Goods.class);
dc.add(Restrictions.like("name", "手机_"));
//2. 生成Criteria执行操作
Session session = HibernateUtils.openSession();
Criteria criteria = dc.getExecutableCriteria(session);
List list = criteria.list();
System.out.println(list);
~~~