Hib的檢索方式
1'導航對象圖檢索方式。通過已經加載的對象,調用.iterator()方法可以得到order對象
如果是首次執行此方法,Hib會從數據庫加載關聯的order對象,否則就從緩存中得到。
2'OID檢索方式。通過session的get,load方法知道了OID的情況下可以使用
3'HQL檢索方式。使用面向對象的HQL查詢語句session的find方法利用HQL來查詢
4'QBC檢索方式。利用QBCAPI來檢索它是封裝了基于字符串的查詢語句
5'本地的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?;
////////////查詢的排序
???1'查詢結果按照客戶姓名升序排列:
???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?order?by?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);?
過濾查詢結果中的重復元素? ?????使用Set集合來去除重復元素;或是使用distinct元素 ?????Iterator?iterator?=?session.createQuery("select?distinct?c.name?from?customer?").list().iterator(); ?????while(iterator.hasnext()){ ???????????String?name?=?(String)?it.next()?; ?????} ///////////使用聚集函數 count();?記錄的條數 min();???求最小值 max();???求最大值 avg();???求平均值 sum();???求和 1'查詢customer中的所有記錄條數 ???integer?i?=?(Integer)?session.createQuery("select?count(*)?from?customer").uniqueResult(); 只有在確定只有一個對象時候使用uniqueResult(); 2'查詢customer中的所有客戶的平均年齡 ???integer?i?=?(Integer)?session.createQuery("select?avg(c.age)?from?customer?c?").uniqueResult(); 3'查詢customer中的客戶年齡的最大值、最小值 一個數組可以看作一個對象 ???object?[]?i?=?(Integer)?session.createQuery("select?max(c.age),min(c.age)?from?customer?c?").uniqueResult(); ???Integer?Maxage?=?(Integer)?i?[0]; ???Integer?Minage?=?(Integer)?i?[1]; 4'統計customer中的客戶的名稱數目,忽略重復的姓名 ???Integer?cout?=?(Integer)?session.createQuery("select?count(distinct?c.name)?from?customer?c").uniqueResult(); ////////////使用分組查詢 1'按姓名分組,統計customer中的相同姓名的記錄數目 ???Iterator?iterator?=?(Integer)?session.createQuery("select?c.name?,count(c)?from?customer?c?group?by?c.name").list.iterator(); ???while(iterator.hasnext()){ ?????????object[]?p?=?(objcet[])iterator.next(); ?????????String?name?=?p[0]; ?????????Integer?cout?=?p[1]; ???} 2'按客戶分組,統計每個客戶的訂單數量 ???Iterator?iterator?=?session.crateQuery("select?c.id?,c.name?,?count(o)?from?customer?c?join?c.order?o?group?by?c.id?").list().iterator; ???while(iterator.hasnext()){ ?????????object[]?p?=?(objcet[])iterator.next(); ?????????Integer?id?=?p[0] ?????????String?name?=?p[1]; ?????????Integer?cout?=?p[2]; ???} 3'統計每個客戶的訂單總價 ???Iterator?iterator?=?session.crateQuery("select?c.id?,c.name,sum(o.price)?from?customer?c?join?c.order?o?group?by?c.id").list.iterator(); ???while(iterator.hasnext()){ ?????????object[]?p?=?(objcet[])iterator.next(); ?????????Integer?id?=?p[0] ?????????String?name?=?p[1]; ?????????Double?cout?=?p[2]; ???} //////////報表的優化 使用HQL時如果只查詢對象的一部分屬性不會返回持久化對象 from?customer?c?join?c.order?o?group?by?c.age;//返回持久化對象,占用緩存。
select?c.id?,?c.name?,?c.age?,o.id?,o.price?from?customer?c?join?c.order?o?group?by?c.age?//返回關系性數據,不占用session的緩存,可以為JVM回收
/////////HQL子查詢的集合函數屬性 size()?返回集合中元素的數目 minIndex()?建立索引的集合獲得最小的索引 maxIndex()?建立索引的集合獲得最大的索引 minElement()?對于包含基本元素的集合獲得集合最小的元素 maxElement()?對于包含基本元素的集合獲得集合最大的元素 element()?獲得集合中的所有元素 ///////////Hibernate的緩存管理 管理一級緩存,不建議使用下列方法來管理一級緩存 evict(Object?o)從緩存中清除參數指定的持久化對象 clear()清空緩存中所有的持久化對象 ///////////批量更新和批量刪除 批量更新customer表中的年齡大于零的所有記錄的AGE字段: ????tx?=?session.beginTransaction(); ????Iterator?customer?=?session.find("from?customer?c?where?c.age?>?0").iterator(); ????while(iterator.hasnext()){ ????????customer?customer?=?(customer)?customer.next(); ????????customer.setAge(customer.getAge()+1); ????} ????tx.commit(); ????session.close();//上述代碼對數據庫操作效果不好可以使用下列的JDBCAPI直連 ??? ????tx?=?session.beginTranscation(); ????Connection?conn?=?session.connection(); ????Preparedstatement?ps?=?conn.preparedstatment("update?customer?set?age?=?age?+?1?where?age?>?0?"); ????ps.executeupdate(); ????tx.commit(); |
posted on 2006-06-19 14:56
Dragonofson 閱讀(7309)
評論(0) 編輯 收藏 所屬分類:
Hiberbate