1. QBC:Query By Criteria -- 按条件进行查询 (如果查询包含查询条件,推荐使用 QBC 进行查询)
2. QBC基本查询:
* 先创建查询的接口
* Criteria c = session.createCriteria(User.class);
* 设置查询的条件
* criteria.add(Restrictions.gt("age", 10));
* 查询数据
* List<User> list = criteria.list();
3.排序查询
*需要使用addOrder()的方法来设置参数,参数使用org.hibernate.criterion.Order对象
*具体代码如下:
Criteria criteria =session.createCriteria(Linkman.class);
criteria.addOrder(Order.desc("lkm_id")); // 设置排序
List<Linkman> list = criteria.list();
for (Linkman linkman : list) {
System.out.println(linkman);
}
4.分页查询
* QBC的分页查询需使用两个方法
* setFirstResult();
* setMaxResults();
example:
Criteria criteria =session.createCriteria(Linkman.class);
criteria.setFirstResult(0);
criteria.setMaxResults(3);
List<Linkman> list =criteria.list();
for (Linkman linkman : list) {
System.out.println(linkman);
}
5.条件查询(Criterion是查询条件的接口,Restrictions类是Hibernate框架提供的工具类,使用该工具类来设置查询条件)
*条件查询使用Criteria接口的add方法,用来传入条件。
*使用Restrictions的添加条件的方法,来添加条件:
* Restrictions.eq --相等
* Restrictions.gt --大于号
* Restrictions.ge --大于等于
* Restrictions.lt --小于
* Restrictions.le --小于等于
* Restrictions.between --在之间
* Restrictions.like --模糊查询
* Restrictions.in --范围
* Restrictions.and --并且
* Restrictions.or --或者
example:
Criteria criteria =session.createCriteria(Linkman.class);
// 设置查询条件
criteria.add(Restrictions.or(Restrictions.eq("lkm_gender","男"), Restrictions.gt("lkm_id", 3L)));
List<Linkman> list =criteria.list();
for (Linkman linkman : list) {
System.out.println(linkman);
}
表达式用法:
Restrictions.isNull("email");
Restrictions.isNotNull("email");
Restrictions.isEmpty("bids");
Restrictions.sizeGe("bids", 3);//bids属性大小
6.聚合函数查询
* 使用Projection(投影)接口,Projections是Hibernate提供的工具类,使用该工具类设置聚合函数查询
*需要使用.setProjection()方法
与Restrictions类相似,Projections类提供了几个用来获取Projection实例的静态工厂方法。在获得Projection对象之后,使用setProjection()方法将它添加到Criteria对象中。 注意,返回的结果集是Object类型,需要对结果进行适当的类型转换。
① avg(String propertyName):计算属性字段的平均值。
② count(String propertyName):统计一个属性在结果中出现的次数。
③ countDistinct(String propertyName):统计属性包含的不重复值的数量。
④ max(String propertyName):计算属性值的最大值。
⑤ min(String propertyName):计算属性值的最小值。
⑥ sum(String propertyName):计算属性值的总和。
*具体的代码如下
Criteria criteria =session.createCriteria(Linkman.class);
criteria.setProjection(Projections.rowCount());
List<Number> list =criteria.list();
Long count = list.get(0).longValue();
System.out.println(count);
注意:
*criteria.setProjection(Projections.sum("cust_id"));多次设置该方法,默认会覆盖!
*解决覆盖的问题:ProjectionList projectionList =Projections.projectionList();向集合中添加聚合函数的设置
example:
Criteria criteria = 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.countDistinct("description"));
criteria.setProjection(projList);
7. 分组查询 --Projections.groupProperty("属性名")
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.rowCount());
projectionList.add(Projections.groupProperty("cust_name"));
c.setProjection(projectionList);
添加一个投影到一个投影列表中时 也可以为它指定一个别名:
List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount(), "catCountByColor" )
.add( Projections.avg("weight"), "avgWeight" )
.add( Projections.max("weight"), "maxWeight" )
.add( Projections.groupProperty("color"), "color" )
) .list();