Criteria條件、動態、分頁、排序、連接、投影、聚合、分組查詢丶離線查詢

1. 條件查詢

1.1 建立標準查詢與增加條件

  • Criteria Session.createCriteria(映射類.class)

    • 創建標準查詢對象,返回Criteria對象
  • Criteria Criteria.add(Criterion對象)

    • 爲標準查詢添加Criterion條件,返回當前的標準查詢對象
//查詢一個具體部門:人事部        
criteria=session.createCriteria(Dept.class);
Criterion criterion=Restrictions.eq("dname", "人事部");
criteria.add(criterion);
Dept dept2=(Dept)criteria.uniqueResult();
System.out.println(dept2.getDname()+","+dept2.getLoc());

1.2 Restrictions比較運算

  • Criterion Restrictions.eq(String 屬性,Object 值) //等於
  • Criterion Restrictions.ne(String 屬性,Object 值) //不等於
  • Criterion Restrictions.gt(String 屬性,Object 值) //大於
  • Criterion Restrictions.ge(String 屬性,Object 值) //大於等於
  • Criterion Restrictions.lt(String 屬性,Object 值) //小於
  • Criterion Restrictions.le(String 屬性,Object 值) //小於等於
  • Criterion Restrictions.isNull(String 屬性) //等於空值
  • Criterion Restrictions.isNotNull(String 屬性) //非空值
//查詢工資高於2000並且職位是CLERK的員工信息
//條件並且關係可以使用add多個Criterion
criteria=session.createCriteria(Emp.class).add(Restrictions.gt("sal", 1000d)).add(Restrictions.eq("job", "CLERK"));
List<Emp> emps=criteria.list();  

//查詢不屬於任何部門的員工信息   
Criterion criterion=Restrictions.isNull("dept");
criteria=session.createCriteria(Emp.class).add(criterion);
emps=criteria.list();  

1.3 Restrictions範圍運算

  • Criterion Restrictions.in(String 屬性,集合或數組)
    • 等於列表中的某一個值
  • Criterion Restrictions.between(String 屬性,Object 值1,Object 值2)
    • 大於等於值1並且小於等於值2
//查詢職位是”CLERK“或者是”SALESMAN“的員工信息,使用in做
//建立一個職位信息集合
List<String> jobs=new ArrayList<String>();
jobs.add("CLERK");
jobs.add("SALESMAN");
 
//使用Restrictions.in(屬性,集合)實現數據庫in功能
criteria=session.createCriteria(Emp.class).add(Restrictions.in("job", jobs));
emps=criteria.list();
//工資在2000到4000之間的員工信息
 criteria=session.createCriteria(Emp.class).add(Restrictions.between("sal", 2000d, 4000d));
 emps=criteria.list();

1.4 Restrictions模糊查詢

  • Criterion Restrictions.like(String 屬性,Object 值,MatchMode 模式)

    • 字符串模糊匹配,不忽略大小寫
  • Criterion Restrictions.ilike(String 屬性,Object 值,MatchMode 模式)

    • 字符串模糊匹配,忽略大小寫
  • MatchMode靜態常量

    • MatchMode.START 以指定字符串開頭
    • MatchMode.END 以指定字符串結尾
    • MatchMode.ANYWHERE 包含指定字符串
    • MatchMode.EXACT 精確匹配
//查詢員工名字包含"T"的員工信息
criteria=session.createCriteria(Emp.class).add(Restrictions.ilike("ename", "T",MatchMode.ANYWHERE));
emps=criteria.list();

1.5 Restrictions邏輯運算

  • Criterion Restrictions.not(Criterion對象)
    • 邏輯非!,條件成立則爲false,否則爲true
  • Criterion Restrictions.and(Criterion 條件1,Criterion 條件2)
    • 邏輯與&&,條件1和條件2都成立才爲true,否則爲false
  • Criterion Restrictions.or(Criterion 條件1,Criterion 條件2)
    • 邏輯或||,條件1或條件2只要一個成立則爲true,兩個都不成立則爲false
  • Disjunction Restrictions.disjunction()
    • 用於存放多個或條件
//查詢職位是”CLERK“或者是”SALESMAN“的員工信息
//條件或者關係使用Restrictions.or(Criterion1,Criterion2)
Criterion criterionA=Restrictions.eq("job", "CLERK");
Criterion criterionB=Restrictions.eq("job", "SALESMAN");
Criterion criterionAorB=Restrictions.or(criterionA, criterionB);
criteria=session.createCriteria(Emp.class).add(criterionAorB);
emps=criteria.list();
//查詢職位是”CLERK“或者是”SALESMAN“的員工信息
 //條件或者關係使用Restrictions.or(Criterion1,Criterion2)
 criterionA=Restrictions.eq("job", "CLERK");
 criterionB=Restrictions.eq("job", "SALESMAN");
 Criterion criterionC=Restrictions.gt("sal", 1000d);
 criteria=session.createCriteria(Emp.class).add(Restrictions.disjunction().add(criterionA).add(criterionB).add(criterionC));
 emps=criteria.list();

1.6 Restrictions集合運算

  • Restrictions.isEmpty(Criterion對象)
    • 集合爲空則爲true,否則爲false
  • Restrictions.isNotEmpty(Criterion對象)
    • 集合不爲空則爲true,否則爲false
//查詢沒有員工的部門
criteria=session.createCriteria(Dept.class).add(Restrictions.isEmpty("emps"));
depts=criteria.list();

2. 動態、分頁、排序查詢

  • Criteria Criteria.setFirstResult(int 查詢的起始位置)
    • 設置分頁的查詢起始位置
  • Criteria Criteria.setMaxResults(int 每頁顯示的行數)
    • 設置分頁的每頁顯示的行數
  • Criteria Criteria.addOrder(Order對象)
    • 設置按指定列排序進行查詢
  • Order的靜態方法
    • Order Order.asc(String 屬性) 升序
    • Order Order.desc(String 屬性) 倒敘
Session session=HibernateUtil.currentSession();
//把條件封裝成EmpCondition類
EmpCondition ec=new EmpCondition();
//給條件賦值
ec.setJob("CLERK");
ec.setSal(1000d);
ec.setStart(Date.valueOf("1985-01-01"));
Criteria criteria=session.createCriteria(Emp.class);
//根據條件是否爲空而添加條件到標準查詢中
if(ec.getSal()!=null){
    criteria.add(Restrictions.gt("sal", ec.getSal()));
}
if(ec.getJob()!=null){
    criteria.add(Restrictions.eq("job", ec.getJob()));
}
if(ec.getStart()!=null){
    criteria.add(Restrictions.gt("hiredate", ec.getStart()));
}
if(ec.getEnd()!=null){
    criteria.add(Restrictions.lt("hiredate", ec.getEnd()));
}
//按sal列降序排列
criteria.addOrder(Order.desc("sal"));
//設置從第幾條記錄開始查詢
criteria.setFirstResult((2-1)*2);
//設置每頁顯示的記錄數
criteria.setMaxResults(2);
//遍歷員工集合
List<Emp> emps=criteria.list();
for(Emp emp:emps){
    System.out.println("員工:"+emp.getEname()+",職位:"+emp.getJob()+",工資:"+emp.getSal()+",入職時間:"+emp.getHiredate());
}

HibernateUtil.closeSession();

3. 連接查詢

  • Criteria Criteria.createCriteria(String 屬性)

    • 建立普通內鏈接
  • Criteria Criteria.createAlias(String 屬性,String 別名)

    • 使用別名建立內連接
  • Criteria Criteria.setFetchMode(String 屬性,FetchMode.JOIN)

    • 建立迫切左外連接
//查詢SALES部門有沒有"a"員工
Criteria criteria=session.createCriteria(Emp.class);
criteria.add(Restrictions.ilike("ename", "a",MatchMode.ANYWHERE));
criteria.createCriteria("dept").add(Restrictions.eq("dname", "SALES").ignoreCase());
List<Emp> emps=criteria.list();
//使用別名連接查詢
criteria=session.createCriteria(Emp.class);
criteria.add(Restrictions.ilike("ename", "a",MatchMode.ANYWHERE));
criteria.createAlias("dept", "d").add(Restrictions.eq("d.dname", "SALES").ignoreCase());
emps=criteria.list();
//迫切左連接
criteria=session.createCriteria(Dept.class,"d");
criteria.setFetchMode("emps", FetchMode.JOIN);
criteria.add(Restrictions.eq("loc", "CHICAGO"));
List<Dept> depts=criteria.list();

4. 投影查詢

  • Criteria Criteria.setProjection(Property對象)
    • 設置投影屬性
  • Property Property.forName(String 屬性)
    • 指定投影屬性
  • ProjectionList Projections.projectionList()
    • 返回屬性集合,可以存放多個屬性
//投影查詢單列所有部門的名稱
criteria=session.createCriteria(Dept.class,"d");
criteria.setProjection(Property.forName("dname"));
List<String> dnames=criteria.list();    
//投影查詢多列所有部門的名稱和位置
criteria=session.createCriteria(Dept.class,"d");
criteria.setProjection(Projections.projectionList().add(Property.forName("dname")).add(Property.forName("loc")));
List<Object[]> objects=criteria.list();

5. 聚合&分組查詢

  • Projections.groupProperty(String 屬性)
    • 根據指定列分組
  • Projection Projections.rowCount()
    • 統計記錄數
  • Projection Projections.avg(String 屬性)
    • 統計平均值
  • Projection Projections.max(String 屬性)
    • 統計最大值
  • Projection Projections.min(String 屬性)
    • 統計最小值
  • Projection Projections.count(String 屬性)
    • 統計某字段的非空記錄數
  • Projection Projections.sum(String 屬性)
    • 統計某一字段求和
//查詢每個部門的平均工資、最高工資和最低工資
Criteria criteria=session.createCriteria(Emp.class,"e");
criteria.createAlias("e.dept", "d");
Projection projection=Projections.groupProperty("d.dname");
Projection projection1=Projections.avg("sal");
Projection projection2=Projections.max("sal");
Projection projection3=Projections.min("sal");
ProjectionList list=Projections.projectionList();
list.add(projection).add(projection1).add(projection2).add(projection3);
criteria.setProjection(list);
List<Object[]> objects=criteria.list();
for(Object[] object:objects){
    System.out.println("部門:"+object[0]+",平均工資"+object[1]+",最高工資"+object[2]+",最低工資"+object[3]);
}

6. DetachedCriteria離線查詢

6.1 理解

  • DetachedCriteria和Criteria繼承同一個接口、DetachedCriteria可以使用Criteria常用的方法
  • DetachedCriteria創建時不需要Session,只有真正查詢時才需要Session
  • DetachedCriteria可以作爲條件用於子查詢

6.2 方法

  • DetachedCriteria.forClass(類名.class,[String 別名])
    • 構建指定類的查詢
  • DetachedCriteria.getExecutableCriteria(session)
    • 使用Session實現真正的查詢
//使用DetachedCriteria構造對Emp類的查詢
DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Emp.class);
//查詢平均工資
detachedCriteria.setProjection(Projections.avg("sal"));
//獲取session開始查詢,返回平均工資
Double sal=(Double)detachedCriteria.getExecutableCriteria(session).uniqueResult();
System.out.println(sal);
 
//使用Criteria構造對Emp類的查詢
criteria=session.createCriteria(Emp.class);
//使用DetachedCriteria作爲Criteria的子查詢的條件
criteria.add(Property.forName("sal").gt(detachedCriteria));
List<Emp> emps=criteria.list();
for(Emp emp:emps){
    System.out.println("員工:"+emp.getEname()+",工資"+emp.getSal());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章