Criteria查詢初學者的采納點哦


一、Hibernate提供了5種檢索對象的方式

     1.導航對象圖檢索方式:根據已經加載的對象導航到其他對象     from  Emp e group by e.dept.deptName

     2.OID檢索方式:按照對象的OID來檢索對象    get/load

     3.HQL檢索方式:使用面向對象的HQL查詢語言 

     4.QBC檢索方式:使用QBC(Query By Criteria)API來檢索對象,這種API封裝了基於字符串形式的查詢語句,提供了更加面向對象的查詢接口

     5.本地SQL檢索方式:使用本地數據庫的SQL查詢語句     createSqlQuery();

二、什么是Criteria查詢(使用QBC(Query By Criteria)API來檢索對象)

      解析:Criteria查詢是Hibernate提供的另一種查詢方式。

     主要由Criteria、Criterion接口和Restrictions類組成,他支持在運行時動態生成查詢語句。

三、實例來講解Criteria的用法。

(一)首先我們我們先來熟悉一下createCriteria()方法

      Criteria criteria = session.createCriteria(Emp.class); 

  解析:使用session.createCriteria()方法創建了criteria對象,createCriteria()方法的參數是持久化類的類型。

List<Emp> list = criteria.list();

解析:使用criteria.list()執行查詢語句,list()方法返回List集合。
@Test
    //1.查詢所有部分信息
        public void SelectPartMessage(){
             Session session = HibernateUtil.currentSession();
               Transaction tx = session.beginTransaction();
               
               Criteria criteria = session.createCriteria(Emp.class); 
               List<Emp> list = criteria.list();
               for (Emp dept : list) {
                   System.out.println(dept.getEmpName());
                 }
               tx.commit();

        }

 

(二)根據條件查詢

  1)比較運算符

    

  HQL運算符                     Criteria運算方法                         說明      
  = SimpleExpression Restrictions.eq(String propertyName,Object value)     等於
  <> SimpleExpression Restrictions.ne(String propertyName,Object value)     不等於
  > SimpleExpression Restrictions.gt(String propertyName,Object value)     大於
  >= SimpleExpression Restrictions.ge(String propertyName,Object value)     大於等於
  < SimpleExpression Restrictions.lt(String propertyName,Object value)     小於
  <= SimpleExpression Restrictions.le(String propertyName,Object value)     小於等於
  is null Criteria Restrictions.isNull(String propertyName)     等於空值
  is not null Criteria Restrictions.isNotNull(String propertyName)     非空值

 

 Criterion eq = Restrictions.eq("empName", "微冷的雨");

  解析: Restrictions其方法的返回值是Criterion類型
@Test
    //按條件查詢
    public void HasMessage(){
         Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           Criteria criteria = session.createCriteria(Emp.class);
           
           Criterion eq = Restrictions.eq("empName", "微冷的雨");
           criteria=criteria.add(eq);
           List<Emp> list=criteria.list();
           for(Emp emps:list){
               System.out.println(emps.getEmpName());
           }
    }

 

 criteria.createAlias("dept", "d"); 解析:查看部門下的員工,用createAlias()方法獲取其部門的屬性值(必須起方法才能獲取部門屬性值);dept(在關聯emp的屬性值在emp定義多對一關聯)d是別名
  
Criterion criterion = Restrictions.eq("d.deptName", "開發部");
解析:d.deptName獲取屬性值
  
 /**
        * 1.3 關聯查詢  查詢“開發部”所有員工
        * 
             */
       @Test
       public void connectTest(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Emp.class);
            
            //Emp中關聯的dept對象,起一個別名   d
            criteria.createAlias("dept", "d");
            
            Criterion criterion = Restrictions.eq("d.deptName", "開發部");
            
            criteria.add(criterion);
    
            List<Emp> list = criteria.list();
            
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
       }

 2)范圍運算符

        HQL運算符             Criteria運算方法                   說明          
in(列表)

 Criterion Restrictions.in(String propertyName,Collecyion values)

或者 Criterion Restrictions.in(String propertyName,Object[] values)

等於類表中的某一個值
not in(列表)  Criterion Restrictions.not(  Restrictions.in()) 不等於列表中的任意一個值
between 值1 and 值2  Criterion Restrictions.between(String propertyName,Object lo,Object hi) 大於等於值1 並且小於等於值2
not between 值1  and 值2  Criterion Restrictions.not(Restrictions.between()) 小於值1 或者大於值2
lists.add("bj"); Criterion criterion=Restrictions.in("empCtity", lists);
解析:empCtity為bj的員工
 //1.4查詢地址為bj的員工信息
       @Test 
       public void hastable(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Emp.class);
            List<String> lists=new ArrayList<String>();
            lists.add("bj");
            Criterion criterion=Restrictions.in("empCtity", lists);
            criteria.add(criterion);
            List<Emp> list = criteria.list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }

       }

 

 3)字符串模式匹配

  Criterion criterion = Restrictions.ilike("empCtity", "%b%");
  解析:Restrictions.ilike()字符串模型匹配同時忽略大小寫(有i)

  解析:Restrictions.like()字符串模型匹配
 
        
 /**
        * 1.5  字符串模式匹配  
        * 查詢員工地址中包含“s”的所有員工,忽略大小寫
           Restrictions.ilike( )  //Ignore Like 
             */
       @Test
       public void likeTest(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           Criteria criteria = session.createCriteria(Emp.class);
           
           Criterion criterion = Restrictions.ilike("empCtity", "%b%");
           
           criteria.add(criterion);
           
            List<Emp> list = criteria.list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }

       }

 

 4)邏輯運算符

  解釋有and邏輯與   or邏輯或  not邏輯非

  Criterion criterion = Restrictions.and(c1, c2);

     解析:將兩個參數傳入

 /**
        * 1.6    邏輯運算
        * and  過濾    查找地址是bj 並且  名稱中包含 “雨” 的員工信息 
             */
       @Test
       public void logicTest(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           Criteria criteria= session.createCriteria(Emp.class);
           Criterion c1 = Restrictions.eq("empCtity", "bj");
           Criterion c2= Restrictions.like("empName", "",MatchMode.ANYWHERE);
           
           Criterion criterion = Restrictions.and(c1, c2);
           
           criteria.add(criterion);
           
            List<Emp> list = criteria.list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
       }

 

 5)集和運算

Criterion criterion = Restrictions.isEmpty("emps");
解析:Restrictions.isEmpty()集合為空,不包括任何元素
 /**
        * 1.7  集合運算
        * 集合運算  查詢 沒有員工的部門
        * */ 
       @Test
       public void collectionTest(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           Criteria criteria = session.createCriteria(Dept.class); 
           //Restrictions類方法的返回值是Criterion
           Criterion criterion = Restrictions.isEmpty("emps");
           
           criteria.add(criterion);
           
            
            List<Dept> list = criteria.list();
            for (Dept dept : list) {
                System.out.println(dept.getDeptName());
            }
       }

 

 (三)動態查詢

  解析:動態查詢就是根據條件進行sql語句的拼接

       /**
        * 1.8  動態查詢    
        * 如何查找出符合以下條件的員工信息:
            職位是工程師,如:job = ‘engineer’
            工資大於2000元,如:salary > 2000
            入職時間在2006年12月31日至2008年12月31日之間 
         如何查找出符合以下條件的員工信息:
            地址 = ‘bj’
            員工編號大於0
     *
        * */ 
       @Test
       public void dynamicTest(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           Criteria criteria = session.createCriteria(Emp.class); 
           //00.構建出一個和page對應的條件類,依次判定條件是否為空
           EmpCondition condition=new EmpCondition();
           condition.setEmpCity("bj");
           condition.setEmpId(0);
           
           //1.2判定之后,動態拼接檢索條件
           if (condition.getEmpCity()!=null) {
               //用戶填寫了地址作為檢索條件
               criteria.add(Restrictions.eq("empCtity", condition.getEmpCity()));
           }
           if(condition.getEmpId()!=null){
               //用戶填寫用戶編號作為篩選條件
               criteria.add(Restrictions.gt("empId", condition.getEmpId()));
           }
            List<Emp> list = criteria.list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
       }

 

(四)Order排序

 /**
        * 1.9  排序   addOrder()
        * 查詢工號大於0的員工,查詢結果按員工 編號升序排列
        * */ 
       @Test
       public void orderTest(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           Criteria criteria = session.createCriteria(Emp.class);
           Criterion criterion = Restrictions.gt("empId", 0);
           criteria.add(criterion).addOrder(Order.asc("empId"));
           List<Emp> list = criteria.list();
            
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }

       }

 

(五)分頁

 /**
        * 1.10 分頁
        * Criteria接口提供了設置分頁的方法
            setFirstResult(int firstResult)  起始記錄的索引
            setMaxResult(int maxResult)  最大記錄條數
            //10.分頁  查詢員工表中的4-6條數據,每頁3條數據
        */
       
       @Test
       public void pageListTest(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           Criteria criteria = session.createCriteria(Emp.class);
           //總記錄數
          
           Projection projection = Projections.count("empId");
          
           criteria.setProjection(projection);
          
           Integer count = ((Long)criteria.uniqueResult()).intValue();
           System.out.println(count);

           //分頁
           int pageSize=3;
           int pageIndex=2;
           criteria.setFirstResult((pageIndex-1)*pageSize);
           criteria.setMaxResults(pageSize);
           List<Emp> list = criteria.list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }

       }

 

(六)DetachedCriteria

 /**
        * 1.11  DetachedCriteria和Criteria功能類似,它實現了CriteriaSpecification接口
            Criteria是由Session對象創建的
            DetachedCriteria創建時不需要Session對象
            使用DetachedCriteria來構造查詢條件
            可以把DetachedCriteria作為方法參數傳遞給業務層
        * 查詢開發部的員工
        * */ 
       @Test  
       public void detachedCriteriaTest(){
           Session session = HibernateUtil.currentSession();
           Transaction tx = session.beginTransaction();
           //構建一個DetachedCriteria對象
           DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Emp.class);
           //別名
           detachedCriteria.createAlias("dept","d");
           //檢索條件
           Criterion criterion = Restrictions.eq("d.deptName", "開發部");
           //綁定
           detachedCriteria.add(criterion);
           List<Emp> list = detachedCriteria.getExecutableCriteria(session).list();
           for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }

       }
       

 

    就此講解到此,希望程序員的我們有收獲!!!!友情提示HibernateUtil工具類

 

package cn.happy.until;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * 工具類
 * @author happy
 *
 */
public class HibernateUtil {
    //getCurrentSession()底層實現原理
    //ThreadLocal變量
    public static final ThreadLocal<Session> threadTL=new ThreadLocal<Session>();
    
   //我想直接調用一個方法,獲取Session
   //定義一個sessionFactory對象
    private static SessionFactory factory;
    private static Configuration cfg;
    static{
        cfg=new Configuration().configure();
        factory=cfg.buildSessionFactory();
    }
    //提供一個靜態方法
    public static Session currentSession(){
        Session session=threadTL.get();
        if(session==null){  //當前線程中沒有session對象
            session=factory.openSession();
            threadTL.set(session);
        }
        return session;
        
    }
    //關閉session
    public static void closeSession(){
        //獲取線程中的session
        Session session = threadTL.get();
        if (session!=null) {
            threadTL.set(null);
            session.close();
        }
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM