Hibernate 的HQL,QBC 查詢語言

1.HQL:(Hibernate Query Language) 是面向對象的查詢語言 

1.實體查詢 sql

Java代碼   收藏代碼
  1. public void testQueryAllDept(){  
  2. String hql="from Employee";  
  3.        //hql="from com.sh.Entity";  
  4. Query query=session.createQuery(hql);  
  5.   
  6. List<Employee> list= query.list();  
  7.   
  8. //...  
  9. }  



2.有條件的 實體查詢 數據庫

Java代碼   收藏代碼
  1. public void testQueryAllDept(){  
  2. String hql="from Deptas model where mode.deptName='人事部' ";  
  3.        //hql="from com.sh.Entity";  
  4. Query query=session.createQuery(hql);  
  5.   
  6. List<Employee> list= query.list();  
  7.   
  8. //...  
  9. }  
  10. public void testQueryAllDept(){  
  11. String hql="from Deptas model where mode.deptName like '%部%' ";  
  12.        //hql="from com.sh.Entity";  
  13. Query query=session.createQuery(hql);  
  14.   
  15. List<Employee> list= query.list();  
  16.   
  17. //...  
  18. }  
  19.   
  20.  public void testQueryDeptByGt(){  
  21.   
  22.  String hql="from Dept model where model.createDate> '2012-03-10'";  
  23.  Query query=session.createQuery(hql);  
  24.  List<Employee> list= query.list();  
  25.  }  




3.HQL 中的各類運算符 緩存

運算符類型 HQL運算符 含義
比較運算 = 等於
  <> 不等於
  > 大於
  >= 大於等於
  <= 小於等於
  < 小於
  is null 爲空
  is not null 不爲空
範圍運算 in 等於列表中的某一值
  not in 不等於列表中的任意一個值
  between  p1 and p2 大於等於值1  且 小於等於值2
  not between p1 and p2 小於值1 或者 大於 值2
字符串模式匹配 like 字符串模式匹配
邏輯運算 and
  or
  not



3.更新 刪除 session

Java代碼   收藏代碼
  1. public void testModifyDate(){  
  2.         Transaction tr=session.beginTransaction();  
  3.         Dept detp=(Dept)session.get(Detp.class,new Integer(6));  
  4.         detp.seteCreateDate("2000-03-10");  
  5.         tr.commit();  
  6.           
  7.     }  
  8.   
  9. // delete  刪除  
  10. public void testDelDeptByHql(){  
  11.         Transaction tr=session.beginTransaction();  
  12.         String hql="delete Dept as model where model.deptId=6";  
  13.         Query query=session.createQuery(hql);  
  14.         query.executeUpdate();  
  15.         tr.commit();  
  16.     }  



4.屬性查詢 函數

Java代碼   收藏代碼
  1. public void testQueryDeptName(){  
  2.     String hql="select model.deptName from Dept as model";  
  3.     Query query=session.createQuery(hql);  
  4.     List<String> deptNameList=query.list();  
  5.     //...  
  6. }  
  7.        public void testQueryDeptName(){  
  8.     String hql="select model.deptName,model.createDate from Dept as model";  
  9.     Query query=session.createQuery(hql);  
  10.     List<Object[]> prsList=query.list();  
  11.                for(){  
  12.                }                 
  13.     //...  
  14. }  
  15.       
  16.    //採用對象進行 保存 查詢的字段(要添加 對應字段的構造方法)  
  17.     public void testQueryDeptName(){  
  18.     String hql="select new Dapt(model.deptName,model.createDate) from Dept as model";  
  19.     Query query=session.createQuery(hql);  
  20.     List<Dept> deptList=query.list();  
  21.                for(Dept d:deptList){  
  22.                   
  23.                   d.setDeptName("test");  
  24.                   session.saveOrUpdate(dept);  
  25.                }                 
  26.     //...  
  27. }  
  28.   
  29.       
  30.    //若是採用對象 保存上面查詢出來的對象  若是對其進行更新的操做 是不會成功的  
  31.   
  32. public void testSaveDept(){  
  33.     Transction  tr=session.beginTransactino();  
  34.     String hql="select new Dept(model.deptName,model.createDate) from Dept as model";  
  35.     Query query=session.createQuery();  
  36.     List<Dept> deptList=query.list();  
  37.     for(Dept dept:deptList){  
  38.         System.out.println(dept.deptName);  
  39.         dept.setDetpName("test");  
  40.         session.saveOrUpdate(dept);  
  41.     }  
  42.     tr.commit();  
  43.       // 最後 根本就沒有更新 而是 在數據庫中 插入 新的記錄  
  44. }  



5.使用函數 性能

Java代碼   收藏代碼
  1. public void testQuyeryFunction(){  
  2.         String hql="select count(*),min(model.createDate) from Dept as model";  
  3.         Query query=session.createQuery(hql);  
  4.         List<Object[]> paramsList=query.list();  
  5.         for(){  
  6.               
  7.         }  
  8.         //...  
  9.     }  



6.分組 與 排序 spa

Java代碼   收藏代碼
  1. //排序  
  2. public void testQueryOrderBy(){  
  3.         String hql="from Dept as mode order by   model.createDate,model.deptName desc";  
  4.         Query query=session.createQuery();  
  5.         List<Dept> deptList=query.list();  
  6.         for(){}  
  7.         //  
  8.           
  9.     }  
  10.   
  11. //分組 而且 使用  having 篩選  
  12. public void testQueryGroupBy(){  
  13.         String hql="select count(model),model.deptName from Dept as model group by model.deptName having count(model)>1";  
  14.         Query query=session.createQuery();  
  15.         List<Object[]> list=query.list();  
  16.         //...  
  17.     }  



7.查詢單個對象 設計

Java代碼   收藏代碼
  1. public void testQueryUn(){  
  2.         String hql="select model.deptName from Dept as model where model.deptId=2";  
  3.         Query query=session.createQuery(hql);  
  4.         query.setMaxResults(1);  
  5.         String deptName=(String)query.uniqueResult();  
  6.         System.out.println(deptNamae);  
  7.     }  




8.綁定參數 
釋義:Hibernate中也採用了preparedStatement做爲底層數據庫的的訪問方式,與之對應的SQL語句 能夠重用preparedStatement對象, 首先會預編譯,而後緩存起來,提升性能. 

1.使用 ":"加參數名 綁定參數 code

Java代碼   收藏代碼
  1. public void  testQueryByParamsName(){  
  2.            //使用  ":參數名" 來傳遞參數  
  3.     String hql="from Dept as model where   
  4. odel.deptName=:deptName and model.createDate=:createDate";  
  5.   
  6.     Query query=session.createQuery(hql);  
  7.     query.setString("deptName","test");  
  8.     query.setString("ceateDate","2000-02-10");  
  9.     List<Dept> deptList=query.list();  
  10.     for(){}  
  11.       
  12.     //...  
  13.       
  14. }  



2.使用 "?" 按照位置來綁定參數 對象

Java代碼   收藏代碼
  1. public void testQueryByParamsID(){  
  2.     String hql="from Dept as model where model.deptName=? and model.createDate=?";  
  3.     Query query=session.createQuery(hql);  
  4.     query.setString(0,"test");  
  5.     query.setString(1,"2000-02-02");  
  6.     List<Dept> list=query.list();  
  7.     for(){}  
  8.     //..  
  9. }  



3.採用setEntity() 將參數和一個持久化對象進行綁定 

Java代碼   收藏代碼
  1. public void testQueryByDept(){  
  2.         Dept dept=(Dept)Session.get(Dept.clas,new Integer(2));  
  3.         String hql="select Employee  as model where model.dept=?"  
  4.         Query query=session.createQuery(hql);  
  5.         query.setEntity(0,dept);  
  6.         List<Employee> empList=query.list();  
  7.         for(){}  
  8.         //..  
  9.           
  10.           
  11.     }  



4.setParameter() 用於綁定任意類型的參數 

Java代碼   收藏代碼
  1. public void testQueryBySetParams(){  
  2.         String hql="from Dept as model where model.deptName=?";  
  3.         Query query=session.createQuery(hql);  
  4.         query.setParameter(0,"test");  
  5.         List<Dept> deptList=query.list();  
  6.         for(){}  
  7.         //..  
  8.     }  



5.setProperties() 將一個參數名 於一個對象的屬性值綁定 

Java代碼   收藏代碼
  1. public void testQueryBySetPro(){  
  2.         Dept deptNew=new  Dept();  
  3.         deptNew.setDeptName("test");  
  4.           
  5.         String hql="from Dept as model where model.deptName=:deptName";  
  6.         Query query=session.createQuery();  
  7.         query.setProperties(deptNew);  
  8.         List<Dept> deptList=query.list();  
  9.         for(){  
  10.               
  11.         }  
  12.         //..  
  13.           
  14.     }  



10. 聯合查詢 
inner join 

Java代碼   收藏代碼
  1. public void testQueryInnerJoin(){  
  2.         String hql="from Dept as model inner join model1.employees as model2";  
  3.         Query query=session.createQuery(hql);  
  4.         List<Object[]> objList=query.list();  
  5.         for(Object[] obj:objList){  
  6.             Dept dept=(Dept)obj[0];  
  7.             Employee emp=(Employee)obj[1];  
  8.             System.out.println("xxxx");  
  9.         }  
  10.     }  



left join 

Java代碼   收藏代碼
  1. public void testQueryLeftJoin(){  
  2.         String hql="from Dept as model left join model1.employees as model2";  
  3.         Query query=session.createQuery(hql);  
  4.         List<Object[]> objList=query.list();  
  5.         for(Object[] obj:objList){  
  6.             Dept dept=(Dept)obj[0];  
  7.             Employee emp=(Employee)obj[1]; //有可能爲空 因此須要判斷  
  8.             if(mep!=null){  
  9.                 System.out.println("xxxx");  
  10.             }else{  
  11.                 System.out.println(null);  
  12.             }  
  13.             System.out.println(dept.getDeptName());  
  14.         }  
  15.     }  



right join 

Java代碼   收藏代碼
  1. public void testQueryRightJoin(){  
  2.     String hql="from Dept as model right join model1.employees as model2";  
  3.     Query query=session.createQuery(hql);  
  4.     List<Object[]> objList=query.list();  
  5.     for(Object[] obj:objList){  
  6.         Dept dept=(Dept)obj[0];  
  7.         Employee emp=(Employee)obj[1]; //有可能爲空 因此須要判斷  
  8.         if(dept!=null){  
  9.             System.out.println(dept.getDeptName());  
  10.         }else{  
  11.             System.out.println(null);  
  12.         }  
  13.         System.out.println("dd"+emp.getEmployeeName());  
  14.     }  
  15. }  



11.子查詢 

Java代碼   收藏代碼
  1. public void testQueryChild(){  
  2.     String hql="from Dept as model where (select count(*) from model.employee) >2";  
  3.     Query query=session.createQuery(hql);  
  4.     List<Dept> objList=query.list();  
  5.     for(){}  
  6.     //..  
  7. }  



12 Criteria 查詢 
釋義:經過面向對象的設計將數據查詢條件封裝在一個對象 

Java代碼   收藏代碼
  1. //無條件  
  2. public void testQueryDept(){  
  3.         Criteria criteria=session.createCriteria(Dept.class);  
  4.         List<Dept> deptList=criteria.list();  
  5.         for(){}  
  6.         //..  
  7.     }  
  8.   
  9. //添加條件  
  10. public void testQueryDeptByName(){  
  11.         Criteria criteria=session.createCriteria(Dept.class);  
  12.         criteria.add(Expression.eq("deptName", "人事部"));  
  13.         List<Dept> deptList=criteria.list();  
  14.         for(){}  
  15.         //..  
  16.     }  



SQL語法查詢機制 

方法 描述
Expression.eq 對應sql中的field =value
Expression.gt 對應sql中的field>value
Expression.ge 對應sql中的field>=value
Expression.lt 對應sql中的field<value
Expression.le 對應sql中的field<=value
Expression.between 對應sql中的between
Expression.like 對應 like
Expression.in 對應 in
Expression.eqProperty 用於比較兩個屬性之間的值,對應的Sql條件中field=field
Expression.gtProperty 用於比較兩個屬性之間的值,對Sqlfiled>field
Expression.geProperty 用於比較兩個屬性之間的值,對應sql field>=field
Expression.ltProperty 用於比較兩個屬性之間的值,對應field<field
Expression.leProperty 用於比較 兩個屬性之間的值,對應field<=field




Hibernate3中採用Restrictions類代替Expression 

Java代碼   收藏代碼
  1. public void  testQueryDeptByNameRe(){  
  2.         Criteria  criteria=session.createCriteria(Dept.class);  
  3.         criteria.add(Restrictions.eq("deptName", "人事部"));  
  4.         List<Dept> deptList=criteria.list();  
  5.         for(){}  
  6.         //..  
  7.           
  8.     }  



Criteria中限定返回的行數 

Java代碼   收藏代碼
  1. public void testQueryDept(){  
  2.         Criteria criteria=session.createCriteria(Dept.class);  
  3.         criteria.setFirstResult(2);  
  4.         criteria.setMaxResults(2);  
  5.         List<Dept> deptList=criteria.list();  
  6.         for(){}  
  7.         //..  
  8.     }  



Criteria排序 

Java代碼   收藏代碼
    1. public void testQueryDept(){  
    2.         Criteria criteria=session.createCriteria(Dept.class);  
    3.         criteria.addOrder(Order.asc("createDate"));  
    4.         List<Dept> deptList=criteria.list();  
    5.         for(){}  
    6.         //..  
    7.     }  
相關文章
相關標籤/搜索