一、Criteria概述
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網絡空間、營銷軟件、網站建設、修水網站維護、網站推廣。? Hibernate提出的面向對象查詢API,非SQL或HQL方式。
二、Criteria使用(5.2之前版本)
? Criteria:標準查詢接口,用來執行查詢和添加條件。
? Criterion:是Criteria的查詢條件,提供了add(Criterion criterion)方法添加查詢條件。
? Restrictions :提供了大量的靜態方法作為Criterion的條件對象。
Projection:用于描述一個投影查詢項,一個 Projection 對象就是一個投影查。
? Projections:提供了大量的靜態方法用于產生 Projection 投影查詢項。
ProjectionList:多個投影查詢項,是投影查詢集合。可以使用add方法來添加投影查詢項。
? Order:描述排序方式。
2、操作使用
? ①創建 Criteria 對象:Criteria c = session.createCriteria(Teacher.class);
? ②設置查詢條件(可選):
?????使用 Restrictions 的靜態方法可以快速生成查詢條件對象 Criterion。
?????????????Restrictions.eq :equal,等于
?????????????Restrictions.gt :great-than >大于
?????????????Restrictions.ge : great-equal >= 大于等于
?????????????Restrictions.lt :less-than< 小于
?????????????Restrictions.le : less-equal<= 小于等于
?????????????Restrictions.between: 對應SQL的 between 子句
?????????????Restrictions.like : 對應SQL的 like 子句
?????????????Restrictions.in :對應SQL的 in子句
?????????????Restrictions.isNull : 判斷屬性是否為空,為空則返回 true
?????????????Restrictions.and :and 關系
?????????????Restrictions.or :or 關系
?????查詢條件對象定義好后要將查詢條件添加到 Criteria 對象中criteria.add(查詢條件對象)
③ 設置投影查詢項(可選):? ?
?????創建投影查詢項:
?????????????Projections.property("屬性名"):創建一個投影查詢項是屬性的 Projection 對象。
?????????????Projections.avg(String propertyName):求平均值的投影查詢對象。
?????????????Projections.count(String propertyName):求屬性出現次數總和的投影查詢對象。
?????????????Projections.max(String propertyName):求屬性大值的投影查詢對象。
?????????????Projections.min(String propertyName):求最小值的投影查詢對象。
?????????????Projections.sum(String propertyName):求和的投影查詢對象。
?????????????Projections.聚合函數(String propertyName, ”別名”):當要使用聚合函數的結果來排序時,可以給聚合函數的投影結果定義別名,最后通過該別名來實現排序。
?????????????Projections.聚合函數(String propertyName).as(”別名”):當要使用聚合函數的結果來排序時,可以給聚合函數的投影結果定義別名,最后通過該別名來實現排序。
?????????????Projections.projectionList():創建一個投影查詢對象集合,一個集合可以保存多個投影查詢項對象。
?????????????projectionList.add(Projection對象):將投影查詢對象添加到投影查詢集合中。
?????????????projectionList.add(Projection對象, 字符串):將投影查詢對象添加到查詢集合中,并為其添加別名。
?????????????Projections.groupProperty(String propertyName):分組。
?????將投影查詢項設置 Criteria 中
?????????????criteria.setProjection(Projection對象)。
? ④排序方式(可選):
?????criteria.addOrder(Order.asc(“屬性名或者別名”)):升序
?????criteria.addOrder(Order.desc(“屬性名或者別名”)):降序
⑤ 設置分頁(可選):
?????criteria.setFirstResult(); 設置起始位置從0開始
?????criteria.setMaxResult(); 設置查詢總行數
⑥ 執行查詢
?????criteria.list();
?????criteria.uniqueResult();
Demo:Criteria使用示例。
public class CriteriaDemo {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
Session session = SessionUtil.openConnection();
//1、查詢所有數據
Criteria criteria = session.createCriteria(Products.class);
Listlist0 = criteria.list();
System.out.println(list0);
//2、條件查詢:單個條件
Criteria criteria1 = session.createCriteria(Products.class);
Criterion lt = Restrictions.lt("p_name", "M416");
criteria1.add(lt);
System.out.println(criteria1.list());
//3、條件查詢:多個條件之and
Criteria criteria2 = session.createCriteria(Products.class);
Criterion lt2 = Restrictions.lt("p_count", 2000);
Criterion gt2 = Restrictions.gt("p_price", 2000.0);
//創建and條件對象
Criterion c = Restrictions.and(lt2, gt2);
criteria2.add(c);
System.out.println(criteria2.list());
//4、條件查詢:多個條件之or
Criteria criteria3 = session.createCriteria(Products.class);
Criterion lt3 = Restrictions.lt("p_count", 2000);
Criterion gt3 = Restrictions.gt("p_price", 2000.0);
//創建and條件對象
Criterion c1 = Restrictions.or(lt3, gt2);
criteria3.add(c1);
System.out.println(criteria3.list());
//5、查詢所有商品的名字
Criteria criteria4 = session.createCriteria(Products.class);
Projection name = Projections.property("p_name");
criteria4.setProjection(name);
System.out.println(criteria4.list());
//6、查詢數據總行數
Criteria criteria5 = session.createCriteria(Products.class);
CountProjection count_id = Projections.count("p_id");
criteria5.setProjection(count_id);
System.out.println(criteria5.uniqueResult());
//7、查詢商品名稱、價格,并根據價格排序
Criteria criteria6 = session.createCriteria(Products.class);
Projection name1 = Projections.property("p_name");
Projection price1 = Projections.property("p_price");
ProjectionList projectionList = Projections.projectionList();
projectionList.add(name1);
projectionList.add(price1);
criteria6.setProjection(projectionList);
List
三、Criteria使用(5.2之后版本)
1、重要API????????
CriteriaBuilder:創建查詢接口的建造者類,用于創建查詢接口CriteriaQuery 對象、查詢條件Predicate對象、投影查詢表達式Expression對象。
CriteriaQuery:查詢接口,用于添加查詢條件,分組,排序,投影查詢。
Root:根據屬性名稱獲取字段名稱,字段名稱可以用于查詢條件和投影查詢中。(from之后,可得到相應的綁定各個屬性對象Path,Path是繼承Expression,兩者都可表達投影。)
Predicate:條件對象。
Expression:表達式對象,用于表達投影查詢的字段,條件中的字段名稱。(select之后)
2、操作使用
? ①創建查詢對象:
CriteriaBuilder criteriaBuilder = EntityManagerFactory.unwrap(SessionFactory.class).
getCurrentSession().getCriteriaBuilder();
CriteriaQuerycriteriaQuery = criteriaBuilder.createQuery(Class c);
Root root = criteriaQuery.from(Class c);
? ②設置查詢條件(可選):
? 創建查詢條件:
criteriaBuilder.equals(root.get(“字段名”), 值);
criteriaBuilder.and();
criteriaBuilder.or();
? 添加查詢條件:
criteriaQuery.where();
③ 設置投影查詢(可選):
? 創建投影查詢項(可選):
?????創建字段投影查詢項:root.get(“字段名稱”)
?????創建聚合函數投影查詢項:criteriaBuilder.avg(root.get("age"));
添加投影查詢項:
criteriaQuery.select(投影查詢項對象);
criteriaQuery.multiselect(投影查詢項對象1,投影查詢項對象2...);
④ 設置分組(可選):criteriaQuery.groupBy(root.get(""));
⑤ 設置排序(可選):
??????criteriaBuilder.asc(root.get(""));//升
criteriaBuilder.asc(criteriaBuilder.avg(root.get("")));//根據聚合函數升序
criteriaBuilder.desc(root.get(""));//降
⑥ 封裝Query對象:Query query = session.createQuery(criteriaQuery);
⑦ 分頁查詢(可選):? ? ? ? ? ? ? ? ? ? ? ? ?
query.setFirstResult(); 設置起始位置從0開始
query.setMaxResult(); 設置查詢總行數
⑧ 執行查詢:
query.getResultList();
query.getSingleResult();
Demo:Criteria使用示例。
public class QBCQuery {
public static void main(String[] args) {
Session session = SessionUtil.openConnection();
//1、查詢所有數據
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(Products.class);
Rootroot = createQuery.from(Products.class);
//執行查詢
Queryquery = session.createQuery(createQuery);
Listlist = query.list();
System.out.println(list);
//2、條件查詢:單個條件
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(Products.class);
Rootroot = createQuery.from(Products.class);
//創建條件
Path path = root.get("p_price");
Predicate price = builder.lt(path, 2000.0);
createQuery.where(price);
//執行查詢
Queryquery = session.createQuery(createQuery);
Listlist = query.list();
System.out.println(list);
//3、條件查詢:多個條件
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(Products.class);
Rootroot = createQuery.from(Products.class);
//創建條件
Pathprice = root.get("p_price");
Pathcount = root.get("p_count");
Predicate pricelt = builder.lt(price, 2000.0);
Predicate countgt = builder.gt(count, 200);
Predicate predicate = builder.and(pricelt,countgt);
createQuery.where(predicate);
//執行查詢
Queryquery = session.createQuery(createQuery);
Listlist = query.list();
System.out.println(list);
//4、投影查詢:查詢單個屬性(查詢所有商品的名稱)
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(String.class);
Rootroot = createQuery.from(Products.class);
//創建查詢條件
Expressionname = root.get("p_name");
createQuery.select(name);
//執行查詢
Queryquery = session.createQuery(createQuery);
Listlist = query.list();
System.out.println(list);
//5、投影查詢:查詢多個屬性(查詢所有商品的名稱和價格)
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(Object[].class);
Rootroot = createQuery.from(Products.class);
//創建查詢條件
Expressionname = root.get("p_name");
Expressionprice = root.get("p_price");
createQuery.multiselect(name,price);
//執行查詢
Queryquery = session.createQuery(createQuery);
Listlist = query.list();
for(Object[] row: list) {
System.out.println(row[0] + ":" + row[1]);
}
//6、投影查詢:查詢多個屬性(查詢所有商品的名稱和價格,加上條件)
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(Object[].class);
Rootroot = createQuery.from(Products.class);
//創建查詢條件
Expressionname = root.get("p_name");
Expressionprice = root.get("p_price");
Expressionmax = builder.max(price);
createQuery.multiselect(name,max);
//執行查詢
Queryquery = session.createQuery(createQuery);
Listlist = query.list();
for(Object[] row: list) {
System.out.println(row[0] + ":" + row[1]);
}
//7、分組、統計、排序
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(Object[].class);
Rootroot = createQuery.from(Products.class);
//分組
createQuery.groupBy(root.get("p_typeid"));
//統計
Expressioncount = builder.count(root.get("p_id"));
//條件
Predicate gt = builder.gt(count, 3); //統計數量大于3的
createQuery.having(gt);
PathpTypeid = root.get("p_typeid");
createQuery.multiselect(count, pTypeid);
//排序
createQuery.orderBy(builder.asc(count));
//執行查詢
Queryquery = session.createQuery(createQuery);
Listlist = query.list();
for(Object[] row: list) {
System.out.println(row[0] + ":" + row[1]);
}
//8、in兩種表達方式①正常條件拼接,②in的循環匹配(新),偽代碼舉例:查詢集合為ids所有商品
① CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(Products.class);
Rootroot = createQuery.from(Products.class);
PathidPath = root.get("id");
Predicate pre = idPath.in(ids);
createQuery.where(pre);
...
② CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuerycreateQuery = builder.createQuery(Products.class);
Rootroot = createQuery.from(Products.class);
IninClause = builder.in(root.get("productIds"));//得到商品ids綁定條件
for (Long id : ids) {
inClause.value(id);//匹配每一個符合的id,實際in在sql的處理相當于循環匹配。
}
createQuery.where(inClause);
...
//9、對于判斷語句的拼接,可采用equal,and
Predicate p1 = builder.equal(root.get("id"), id);
builder.and(..., p1);
//10、有的時候where后面條件根據判斷會不存在的情況,類似... where 1=1
Predicate p1 = builder.conjunction();
...
}
}
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文題目:總結Criteria的簡要使用概述(Hibernate5.2+)-創新互聯
當前網址:http://vcdvsql.cn/article16/csidgg.html
成都網站建設公司_創新互聯,為您提供網站營銷、網站維護、微信公眾號、品牌網站建設、標簽優化、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯