java中使用QBC的好处_Criteria(QBC)

[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);

~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值