Hibernate的查詢方法

1: QBE (Query By Example) 
   Criteria cri = session.createCriteria(Student.class); 
   cri.add(Example.create(s)); //s是一個 Student 對象 
   list cri.list();    
   實質:建立一個模版,好比我有一個表serial 有一個  giftortoy 字段,我設置 serial.setgifttoy(\"2\"), 
         則這個表中的全部的giftortoy 爲 2 的數據都會出來 
QBC查詢方式 

QBC(Query By Criteria)查詢方式是 Hibernate 提供的 「 更加面向對象 」 的一種檢索方式。 QBC 在條件查詢上比 HQL 查詢更爲靈活,並且支持運行時動態生成查詢語句。 
在Hibernate 應用中使用 QBC 查詢一般通過 3 個步驟 
  (1)使用 Session 實例的 createCriteria() 方法建立 Criteria 對象 
  (2)使用工具類 Restrictions 的相關方法爲 Criteria 對象設置查詢對象 
  (3)使用 Criteria 對象的 list() 方法執行查詢,返回查詢結果 
Restrictions類的經常使用方法 
Restrictions.eq(String propertyName,Object value) 
等於 
Restrictions.allEq(Map propertyNameValues) 
使用Map key/value 進行多個等於的比對 
Restrictions.gt(String propertyName, Object value) 
大於 >    (gt----->greater than) 
Restrictions.ge(String propertyName, Object value) 
大於等於 >=    (ge----->greater equal) 
Restrictions.It(String propertyName, Object value) 
小於< (It---->less than) 
Restrictions.Le(String propertyName, Object value) 
小於等於<= (le---->less equal) 
Restrictions.between(String propertyName, Object lo, Object hi) 
對應SQL 語句的 Between 子句 
Restrictions.like(String propertyName, Object value) 
對應SQL 語句的 LIKE 子句 
Restrictions.in(String propertyName, Collection value) 
對應SQL 語句的 in 子句 
Restrictions.and(Criterion lhs, Criterion rhs) 
And關係 
Restrictions.or(Criterion lhs, Criterion rhs) 
Or關係 
Restrictions.sqlRestriction(String sql,Object[] values,Type[] types) 
SQL限定查詢 

           工具類Order 提供設置排序方式 
Order.asc(String propertyName) 
升序排序 
Order.desc(String propertyName) 
降序排序 

          工具類Projections 提供對查詢結果進行統計與分組操做 
Porjections.avg(String propertyName) 
求某屬性的平均值 
Projections.count(String propertyName) 
統計某屬性的數量 
Projections.countDistinct(String propertyName) 
統計某屬性的不一樣值的數量 
Projections.groupProperty(String propertyName) 
指定一組屬性值 
Projections.max(String propertyName) 
某屬性的最大值 
Projections.min(String propertyName) 
某屬性的最小值 
Projections.projectionList() 
建立一個新的projectionList 對象 
Projections.rowCount() 
查詢結果集中記錄的條數 
Projections.sum(String propertyName) 
返回某屬性值的合計 

QBE查詢 

   QBE查詢就是檢索與指定樣本對象具備相同屬性值的對象。所以 QBE 查詢的關鍵就是樣本對象的建立,樣本對象中的全部非空屬性均將做爲查詢條件。 QBE 查詢的功能子集,雖然 QBE 沒有 QBC 功能大,可是有些場合 QBE 使用起來更爲方便。 

         工具類Example 爲 Criteria 對象指定樣本對象做爲查詢條件 
Java代碼   
1  Session session = HibernateSessionFactory.getSessionFactory().openSession();   
2  Transaction ts = session.beginTransaction();   
3  Customer c =  new  Customer();   
4  c.setCname("Hibernate");   
5  Criteria criteria = session.createCriteria(Customer. class );   
6  Criteria.add(Example.create(c));   
7  Iterator it = criteria.list().iterator();   
8  ts.commit();  
9  HibernateSessionFactory.closeSession();  
QBC分頁查詢 
   Criteria爲咱們提供了兩個有用的方法: setFirstResult(int firstResult) 和 setMaxResults(int maxResults). 
setFirstResult(int firstResult)方法用於指定從哪個對象開始檢索(序號從 0 開始),默認爲第一個對象(序號爲 0 ); setMaxResults(int maxResults) 方法用於指定一次最多檢索出的對象數目,默認爲全部對象。 
Java代碼   
1  Session session = HibernateSessionFactory.getSessionFactory().openSession();   
2  Transaction ts =  null ;   
3  Criteria criteria = session.createCriteria(Order. class );   
4  int  pageSize = 15;   
5  int  pageNo = 1;   
6  criteria.setFirstResult((pageNo-1)*pageSize);   
7  criteria.setMaxResults(pageSize);   
8  Iterator it = criteria.list().iterator();   
9  ts.commit();   
10  HibernateSessionFactory.closeSession(); 

QBC複合查詢 
   複合查詢就是在原有的查詢基礎上再進行查詢。例如在顧客對定單的一對多關係中,在查詢出全部的顧客對象後,但願在查詢定單中money 大於 1000 的定單對象 
DetachedCriteria  criteria= DetachedCriteria . forClass (Model. class ); 
criteria.add(Restrictions. eq ( "userid" , userid)); 
criteria.add(Restrictions. eq ( "state" , false )); 
criteria.add(Restrictions. not ( Expression . eq ( "freeze" , false )  )); 
criteria.addOrder( Order. desc ( "createtime" ) ); 
return   modelDAO .findByCriteria(criteria); 
Java代碼 
1  Session session = HibernateSessionFactory.getSessionFactory().openSession();   
2  Transaction ts = session.beginTransaction();   
3  Criteria cuscriteria = session.createCriteria(Customer. class );   
4  Criteria ordCriteria = cusCriteria.createCriteria("orders");   
5  ordCriteria.add(Restrictions.gt("money",  new  Double(1000)));   
6  Iterator it = cusCriteria.list().iterator();   
7  ts.commit();   
8  HibernateSessionFactory.closeSession();  
QBC離線查詢 
   離線查詢又叫DetachedCriteria 查詢,它能夠在 Session 以外進行構造,只有在須要執行查詢時才與 Session 綁定。 
2: QBC (Query By Criteria) 主要有 Criteria,Criterion,Oder,Restrictions 類組成 
   session = this.getSession(); 
   Criteria cri = session.createCriteria(JdItemSerialnumber.class); 
   Criterion cron = Restrictions.like(\"customer\",name); 
   cri.add(cron); 
   list = cri.list(); 
   ============================== 
   比較運算符 
   HQL運算符                    QBC 運算符                      含義 
      =                     Restrictions.eq()                  等於 
      <>                   Restrictions.not(Exprission.eq())  不等於 
      >                     Restrictions.gt()                  大於 
      >=                   Restrictions.ge()                  大於等於 
      <                     Restrictions.lt()                  小於  [Page] 
      <=                   Restrictions.le()                  小於等於 
      is null             Restrictions.isnull()              等於空值 
      is not null      Restrictions.isNotNull()           非空值 
      like                 Restrictions.like()                字符串模式匹配 
      and                Restrictions.and()                 邏輯與 
      and                Restrictions.conjunction()         邏輯與 
      or                   Restrictions.or()                  邏輯或 
      or                   Restrictions.disjunction()         邏輯或 
      not                  Restrictions.not()                 邏輯非 
      in(列表 )          Restrictions.in()                   等於列表中的某一個值  [Page] 
ont in(列表 )         Restrictions.not(Restrictions.in()) 不等於列表中任意一個值 
      between x and y      Restrictions.between()             閉區間 xy 中的任意值 
      not between x and y  Restrictions.not(Restrictions..between()) 小於值 X 或者大於值 y 
3: HQL 
   String hql = \"select s.name ,avg(s.age) from Student s group by s.name\"; 
   Query query = session.createQuery(hql); 
   list = query.list(); 
   .... 
4: 本地 SQL 查詢 
   session = sessionFactory.openSession(); 
   tran = session.beginTransaction(); 
   SQLQuery sq = session.createSQLQuery(sql); 
   sq.addEntity(Student.class); 
   list = sq.list(); 
   tran.commit(); 
5: QID  
   Session的 get() 和 load() 方法提供了根據對象 ID 來檢索對象的方式。該方式被用於事先知道了要檢索對象 ID 的狀況。  
Hibernate: HQL/QBC 查詢語言比較的用法 
Hib的檢索方式  1 、導航對象圖檢索方式。經過已經加載的對象,調用 .iterator() 方法能夠獲得 order 對象若是是首次執行此方法, Hib 會從數據庫加載關聯的 order 對象,不然就從緩存中獲得。  2 、 OID 檢索方式。經過 session 的 get , load 方法知道了 OID 的狀況下可使用  3 、 HQL 檢索方 

Hib的檢索方式 
   一、導航對象圖檢索方式。經過已經加載的對象,調用 .iterator() 方法能夠獲得 order 對象若是是首次執行此方法, Hib 會從數據庫加載關聯的 order 對象,不然就從緩存中獲得。 
二、 OID 檢索方式。經過 session 的 get , load 方法知道了 OID 的狀況下可使用 
三、 HQL 檢索方式。使用面向對象的 HQL 查詢語句 session 的 find 方法利用 HQL 來查詢 
四、 QBC 檢索方式。利用 QBCAPI 來檢索它是封裝了基於字符串的查詢語句 
五、本地的 SQL 檢索方式。使用本地數據庫的 SQL 查詢語句 Hib 會負責把檢索到的 JDBC 結果集映射爲持久化對象圖。 
  五種檢索方式的使用場合和特色: 
HQL : 是面向對象的查詢語言,同 SQL 有些類似是 Hib 中最經常使用的方式。 
查詢設定各類查詢條件。 
支持投影查詢,檢索出對象的部分屬性。 
支持分頁查詢,容許使用having 和 group by 
提供內製的彙集函數,sum() , min() , max() 
能調用用戶的自定義SQL 
支持子查詢,嵌入式查詢 
支持動態綁定參數 
建議使用Query 接口替換 session 的 find 方法。 

Query Q = session.createQuery("from customer as c where c.name = :customerName" +"and c.age = :customerAge"); 
query.setString("customerName" , "tom"); 
   query.setInteger("customerAge" , "21"); 
   list result = query.list(); 
QBC : QBCAPI提供了另外一種方式,主要是 Criteria 接口、 Criterion 接口和 Expression 類 
Criteria criteria = session.createCriteria(customer.class); 
   Criterion criterion1 =Expression.like("name","t%"); 
   Criterion criterion2 =Expression.eq("age",new Integer(21)); 
   Critera = criteria.add(criterion1) ; 
   Critera = criteria.add(criterion2) ; 
   list result = criteria.list(); 
或是: list result = session.createCriteria(Customer.class).add(Expression.eq("this.name","tom")).list(); 
SQL : 採用 HQL 和 QBC 檢索時, Hib 生成 SQL 語句適用全部數據庫。 
Query query  =session.createSQLQuery("select {c.*} from customers c where c.name like : customername " + "and c.age =:customerage","c",customer.calss); 
   query.setString("customername","tom"); 
   query.setInteger("customerage","21"); 
   list result = query.list(); 
/////////////多態查詢 
   HQL : session.createQuery("from employee"); 
   QBC : session.createCriteria(employee.class); 
   HQL : session.createQuery("from hourlyEmployee"); 
   QBC : session.createCriteria(hourlyEmployee.class); 
下面的HQL 查詢語句將檢索出全部的持久化對象: 
from java.lang.Object ; 
from java.io.serializable ; 
////////////查詢的排序 
一、查詢結果按照客戶姓名升序排列: 
HQL : 
Query query = session.createQuery 
("from customer c order by c.name"); 
QBC : 
Criteria criteria = session.createCriteria(customer.class); 
criteria.addOrder(order.asc("name")); 
HQL : 
Query query = session.createQuery("from customer c orderby c.name asc , c.age desc"); 
QBC : 
Criteria criteria =session.createCriteria(customer.class); 
criteria.addOrder(order.asc ("name")); 
criteria.addOrder(order.desc("age")); 
import net.sf.hibernate.pression.Order 
import mypack.Order 
........... 
Criteria criteria = session.createCritria (mypack.Order.class); 
criteria.addOrder(net.sf.hibernate.Order.asc("name")); 
///////////HQL語句的參數綁定 Query 接口 
提供了綁定各類Hib 映射類型的方法。 
setBinary() 
setString() 
setBoolean() 
setByte() 
setCalendar() 
setCharacter() 
setDate() 
setDouble() 
setText() 
setTime() 
setTimestamp() 
setEntity() 
//把參數與一個持久化類的事例綁定 
lsit result = session.createQuery 
("from order o where o.customer = :customer").setEntity("customer" , customer).list ; 
setParameter() 
//綁定任意類型的參數 
setProperties() 
//把命名參數與一個對象的屬性值綁定 
Query query = session.createQuery 
("from customer c where c.name =:name " + "and c.age =:age" ); 
Query.setProperties(customer);java

Java代碼   收藏代碼
  1. public AlBasic queryAlBasicByEtpsIdAndAnnlYear(String entityName, String etpsId, String annlYear) {  
  2.         if (etpsId == null || "".equals(etpsId) || annlYear == null || "".equals(annlYear))  
  3.             return null;  
  4.         DetachedCriteria dc = DetachedCriteria.forEntityName(entityName);  
  5.         dc.add(Restrictions.eq("etpsId", etpsId));  
  6.         dc.add(Restrictions.eq("annlYear", annlYear));  
  7.   
  8.         List result = findByCriteria(dc);  
  9.         if (result == null || result.size() == 0) {  
  10.             return null;  
  11.         }  
  12.         return (AlBasic) result.get(0);  
  13.     }  
相關文章
相關標籤/搜索