Hibernate Criteria查询
虽然可以自己写Sql,但在程序中需要动态生成Sql语句时,where子句中条件是动态产生时,使用Criteria是再好不过的选择。
先看例子:
Criteria criteria=session.createCriteria(Product.class);
Criterion criterion1=Restrictions.between("id", 10, 15); //Criterion接口
criteria.add(criterion1);
List<Product> list=criteria.list();
for(Product p:list){
System.out.println(p.getId()+" "+p.getName());
}
输出:
Hibernate:
select
this_.ID as ID4_0_,
this_.NAME as NAME4_0_,
this_.PRICE as PRICE4_0_,
this_.DESCRIPTION as DESCRIPT4_4_0_
from
hib.product this_
where
this_.ID between ? and ?
10 台灯3
11 台灯2
15 台灯
可以使用方法链,因为add()后仍返回当前Criteria对象。如下
List<Product> list=session.createCriteria(Product.class).add(Restrictions.between("id",10,15)).list();
1.排序 criteria.addOrder(Order.desc("id"));
2.分页
criteria.setMaxResults(3);
criteria.setFirstResult(3);
mysql产生如下语句:
Hibernate:
select
this_.ID as ID4_0_,
this_.NAME as NAME4_0_,
this_.PRICE as PRICE4_0_,
this_.DESCRIPTION as DESCRIPT4_4_0_
from
hib.product this_ limit ?,
?
oracle则产生:
select * from(
select row_.*,rownum rownum_
from(
原始sql语句
) row_
where rownum<=?
)
where rownum_>?
3.单条记录
criteria.setMaxResults(1); Product p=(Product)criteria.uniqueResult();
4.在关联对象上增加条件
Criteria criteria=session.createCriteria(Product.class);
criteria.createCriteria("category").add(Restrictions.between("id",35, 40));
//Product和Category是多对一的关系
//Prodcut类中成员 Category category;
输出:
select
this_.ID as ID4_1_,
this_.CATEGORY_ID as CATEGORY2_4_1_,
this_.NAME as NAME4_1_,
this_.PRICE as PRICE4_1_,
this_.DESCRIPTION as DESCRIPT5_4_1_,
category1_.ID as ID3_0_,
category1_.NAME as NAME3_0_,
category1_.DESCRIPTION as DESCRIPT3_3_0_
from
hib.pro this_
inner join
hib.category category1_
on this_.CATEGORY_ID=category1_.ID
where
category1_.ID between ? and ?
使用内连接查询。如果是一的一方中增加对多的一方的条件,则结果是类似的。
Criteria criteria=session.createCriteria(Category.class);
criteria.createCriteria("products").add(Restrictions.between("id",1,2));
criteria.list();
输出:
Hibernate:
select
this_.ID as ID3_1_,
this_.NAME as NAME3_1_,
this_.DESCRIPTION as DESCRIPT3_3_1_,
product1_.ID as ID4_0_,
product1_.CATEGORY_ID as CATEGORY2_4_0_,
product1_.NAME as NAME4_0_,
product1_.PRICE as PRICE4_0_,
product1_.DESCRIPTION as DESCRIPT5_4_0_
from
hib.category this_
inner join
hib.pro product1_
on this_.ID=product1_.CATEGORY_ID
where
product1_.ID between ? and ?
5.统计函数查询
criteria.setProjection(Projections.max("price"));
Float f=(Float)criteria.uniqueResult();
System.out.println(f);
6.多个统计值
Criteria criteria=session.createCriteria(Product.class);
ProjectionList proList=Projections.projectionList();
proList.add(Projections.max("price"));
proList.add(Projections.min("price"));
criteria.setProjection(proList);
Object[] values=(Object[])criteria.uniqueResult();
7.分组统计
Criteria criteria=session.createCriteria(Product.class);
ProjectionList proList=Projections.projectionList();
proList.add(Projections.max("price"));
proList.add(Projections.min("price"));
proList.add(Projections.rowCount());
proList.add(Projections.groupProperty("category"));//注意这里都是指POJO类的属性名,而不是数据库列名
criteria.setProjection(proList);
List<Object[]> values=criteria.list();
8.使用别名,
proList.add(
Projections.alias(
Projections.max("price"),"maxp") //别名的好处是下文可以用别名来限定条件
);
或者: proList.add( Projections.max("price").as("maxp"));
9.投影查询,限定列
ProjectionList proList=Projections.projectionList();
proList.add(Property.forName("price"));
proList.add(Property.forName("id"));
criteria.setProjection(proList);
10.使用org.hibernate.criterion.Property.forName()方法实现分组统计
proList.add(Property.forName("price").max());
proList.add(Property.forName("category").group().as("c"));
11.使用DetachedCriteria(不与Session对象绑定,独立)
//表现层,保存用户的动态查询条件
DetachedCriteria dc=DetachedCriteria.forClass(Product.class);
dc.add(Restrictions.between("id", 1, 5))
.add(Restrictions.like("name", "台"));
dc.addOrder(Order.desc("id"));
//业务逻辑层与当前Session绑定
//获取,开启session
Criteria criteria=dc.getExecutableCriteria(session);
List values=criteria.list();
12.根据示例对象查询(QBE)
Product p1=new Product();
p1.setName("台");
Criteria criteria=session.createCriteria(Product.class);
criteria.add(Example.create(p1));
List values=criteria.list();
浙公网安备 33010602011771号