Hibernate QBC查询知识点总结

Hibernate :QBC查询基本步骤与常规运算符

QBC查询的基本步骤
这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。
使用QBC查询,一般需要以下三个步骤:

1:使用Session实例的createCriteria()方法创建Criteria对象;
2:使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组;
3:使用Criteria对象的list()方法进行查询并返回结果。
具体:

Criteria创建 --> session.createCriteria(Class persistentClass) (更多重载参考)
条件添加 --> add(Criterion criterion) 限定条件、 addOrder(Order order) 限定顺序、 setProjection(Projection projection) 限定统计动作
结果返回 --> list()

Restrictions、Order、Projections的常用方法
Restrictions类的常用方法(设置查询条件):

返回值类型 方法名称 描述
SimpleExpression Restrictions.eq 等于(equal)
Criterion Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
SimpleExpression Restrictions.gt 大于(great than)
SimpleExpression Restrictions.ge 大于等于(great than or equal)
SimpleExpression Restrictions.lt 小于(less than)
SimpleExpression Restrictions.le 小于等于(less than or equal)
Criterion Restrictions.between 对应SQL的between
SimpleExpression Restrictions.like 对应SQL的like
Criterion Restrictions.in 对应SQL的in
LogicalExpression Restrictions.and and关系
LogicalExpression Restrictions.or or关系
Criterion Restrictions.isNull 为空
Criterion Restrictions.sqlRestriction SQL限定查询

Order类的常用方法(设置排序方式):

返回值类型 方法名称 描述
Order Order.asc 升序
Order Order.desc 降序

Projections类的常用方法(统计和分组):

返回值类型 方法名称 描述
AggregateProjection Projections.avg 求平均值
CountProjection Projections.count 统计某属性的数量
CountProjection Projections.countDistinct 统计某属性不同值的数量
PropertyProjection Projections.groupProperty 指定某个属性为分组属性
AggregateProjection Projections.max 求最大值
AggregateProjection Projections.min 求最小值
ProjectionList Projections.projectionList 创建一个ProjectionList对象
Projection Projections.rowCount 查询结果集中的记录条数
AggregateProjection Projections.sum 求某属性的合计

OR查询
//查找age等于(eq)20或(or)age为空(isNull)的User
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or( Restrictions.eq(“age”, new Integer(20)), Restrictions.isNull(“age”) ));
List users = criteria.list();

//实际上它产生的对应的sql如下
Hibernate:
select
this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_
from
T_USER this_
where
(this_.age=? or this_.age is null)

Projections用法
DetachedCriteria dc = this.createDetachedCriteria();
dc.add(Restrictions.eq(type, type));
dc.setProjection(Projections.distinct(Projections.property(“label”)));//排除重复

Hibernate的Projections工厂类包含了以下几个常用的统计函数:
① avg(String propertyName):计算属性字段的平均值。
② count(String propertyName):统计一个属性在结果中出现的次数。
③ countDistinct(String propertyName):统计属性包含的不重复值的数量。
④ max(String propertyName):计算属性值的最大值。
⑤ min(String propertyName):计算属性值的最小值。
⑥ sum(String propertyName):计算属性值的总和。
Criteria criteria = session.createCriteria(User.class);

criteria.add(Restrictions.eq(“depart”, “depart1”));

criteria.setProjection(Projections.count(“id”));

Long count = (Long)criteria.uniqueResult();

类似于sql:
select count(id) from user where depart = depart1
查询出来的结果:
count
1231

Criteria Crit = getSession().createCriteria(Product.class);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.max(“price”));
projList.add(Projections.min(“price”));
projList.add(Projections.avg(“price”));
projList.add(Projections.maxDistinct(“price”)); //执行给max函数去重
Crit.setProjection(projList);
List result = Crit.list();
类似:
select max(distinct price),min(price),avg(price) from product

查询depart1部门的人数, 这种方式要比list再去取size好一些
QBC:分页
//开始位置 criteria.setFirstResult(0);

//每页记录数 criteria.setMaxResults(2);

//开始位置 criteria.setFirstResult(5); 第六条数据开始

//每页记录数 criteria.setMaxResults(10); 一次性读取十条

图片: 运算符汇总
![Alt]Hibernate QBC查询知识点总结