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