Hibernate-HQL
?User u = (User) users.get(0);???????? u.setName("新用戶名" + count);???????? //當count為20的倍數(shù)時,將更新的結果從Session中flush到數(shù)據庫???????? if ( ++count % 20 == 0 )???????? {???????????? session.flush();???????????? session.clear();???????? }???? }???? tx.commit();???? HibernateUtil.closeSession(); } 通過這種方式,雖然可以執(zhí)行批量更新,但效果非常不好。執(zhí)行效率不高,而且需要先執(zhí)行數(shù)據查詢,然后再執(zhí)行數(shù)據更新,并且這種更新將是逐行更新,即每更新一行記錄,都需要執(zhí)行一條update語句,性能非常低下。為了避免這種情況,Hibernate提供了一種類似于SQL的批量更新和批量刪除的HQL語法。 4.2.3??SQL風格的批量更新/刪除 Hibernate提供的HQL語句也支持批量的UPDATE和DELETE語法。批量UPDATE和DELETE語句的語法格式如下: UPDATE | DELETE FROM? ClassName??[WHERE WHERE_CONDITIONS] 關于上面的語法格式有以下四點值得注意:?? ● 在FROM子句中,FROM關鍵字是可選的。即完全可以不寫FROM關鍵字。?? ● 在FROM子句中只能有一個類名,該類名不能有別名。?? ● 不能在批量HQL語句中使用連接,顯式的或隱式的都不行。但可以在WHERE子句中使用子查詢。?? ● 整個WHERE子句是可選的。 假設,需要批量更改User類實例的name屬性,可以采用如下代碼片段完成: private void testUser()throws Exception {???? //打開Session???? Session session = HibernateUtil.currentSession();???? //開始事務???? Transaction tx = session.beginTransaction();???? //定義批量更新的HQL語句???? String hqlUpdate = "update User set name = :newName";???? //執(zhí)行更新???? int updatedEntities = session.createQuery( hqlUpdate )????????????????????????????.setString( "newName", "新名字" )????????????????????????????.executeUpdate();???? //提交事務???? tx.commit();???? HibernateUtil.closeSession(); } 從上面代碼中可以看出,這種語法非常類似于PreparedStatement的executeUpdate語法。實際上,HQL的這種批量更新就是直接借鑒了SQL語法的UPDATE語句。注意:使用這種批量更新語法時,通常只需要執(zhí)行一次SQL的UPDATE語句,就可以完成所有滿足條件記錄的更新。但也可能需要執(zhí)行多條UPDATE語句,這是因為有繼承映射等特殊情況,例如有一個Person實例,它有Customer的子類實例。當批量更新Person實例時,也需要更新Customer實例。如果采用joined-subclass或union-subclass映射策略,Person和Customer實例保存在不同的表中,因此可能需要多條UPDATE語句。執(zhí)行一個HQL DELETE,同樣使用 Query.executeUpdate() 方法,下面是一次刪除上面全部記錄的代碼片段: private void testUser()throws Exception {???? //打開Session實例???? Session session = HibernateUtil.currentSession();???? //開始事務???? Transaction tx = session.beginTransaction();???? //定義批量刪除的HQL語句???? String hqlUpdate = "delete User";???? //執(zhí)行批量刪除???? int updatedEntities = session.createQuery( hqlUpdate )????????????????????????????.executeUpdate();???? //提交事務???? tx.commit();???? //關閉Session???? HibernateUtil.closeSession(); } 由Query.executeUpdate()方法返回一個整型值,該值是受此操作影響的記錄數(shù)量。實際上,Hibernate的底層操作是通過JDBC完成的。因此,如果有批量的UPDATE或DELETE操作被轉換成多條UPDATE或DELETE語句,該方法返回的是最后一條SQL語句影響的記錄行數(shù)。 4.3??使用HQL查詢 Hibernate提供了異常強大的查詢體系,使用Hibernate有多種查詢方式。可以選擇使用Hibernate的HQL查詢,或者使用條件查詢,甚至可以使用原生的SQL查詢語句,此外還提供了一種數(shù)據過濾功能,這些都可用于篩選目標數(shù)據。下面分別介紹Hibernate的4種數(shù)據篩選方法: 4.3.1??HQL查詢 HQL是Hibernate Query Language的縮寫,HQL的語法很像SQL的語法,但HQL是一種面向對象的查詢語言。因此,SQL的操作對象是數(shù)據表和列等數(shù)據對象,而HQL的操作對象是類、實例、屬性等。 HQL是完全面向對象的查詢語言,因此可以支持繼承和多態(tài)等特征。 HQL查詢依賴于Query類,每個Query實例對應一個查詢對象。使用HQL查詢可按如下步驟進行:(1)獲取Hibernate Session對象;(2)編寫HQL語句;(3)以HQL語句作為參數(shù),調用Session的createQuery方法創(chuàng)建查詢對象;(4)如果HQL語句包含參數(shù),調用Query的setXxx方法為參數(shù)賦值;(5)調用Query對象的list等方法遍歷查詢結果。看下面的查詢示例: public class HqlQuery {???? public static void main(String[] args)throws Exception???? {???????? HqlQuery mgr = new HqlQuery();???????? //調用查詢方法???????? mgr.findPersons();???????? //調用第二個查詢方法???????? mgr.findPersonsByHappenDate();???????? HibernateUtil.sessionFactory.close();???? }???? //第一個查詢方法???? private void findPersons()???? {???????? //獲得Hibernate Session???????? Session sess = HibernateUtil.currentSession();???????? //開始事務???????? Transaction tx = sess.beginTransaction();???????? //以HQL語句創(chuàng)建Query對象.???????? //執(zhí)行setString方法為HQL語句的參數(shù)賦值???????? //Query調用list方法訪問查詢的全部實例???????? List pl = sess.createQuery("from Person p where p.myEvents.title???????? = :eventTitle")???????????????????????? .setString("eventTitle","很普通事情")???????????????????????? .list();???????? //遍歷查詢的全部結果???????? for (Iterator pit = pl.iterator() ; pit.hasNext(); )???????? {???????????? Person p = ( Person )pit.next();???????????? System.out.println(p.getName());???????? }
總結
以上是生活随笔為你收集整理的Hibernate-HQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 星巴克什么饮料热量低?
- 下一篇: Hibernate中常见的异常