隨筆-208  評(píng)論-469  文章-30  trackbacks-0

          Hibernate3.0 采用新的基于ANTLR的HQL/SQL查詢翻譯器,在Hibernate的配置文件中,hibernate.query.factory_class屬性用來選擇查詢翻譯器。
          (1)選擇Hibernate3.0的查詢翻譯器:
          hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
          (2)選擇Hibernate2.1的查詢翻譯器
          hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory
          為了使用3.0的批量更新和刪除功能,只能選擇(1)否則不能解釋批量更新的語句。選擇(2)但沒法解釋批量更新語句了。

          大批量更新/刪除(Bulk update/delete)

          就像已經(jīng)討論的那樣,自動(dòng)和透明的 對(duì)象/關(guān)系 映射(object/relational mapping)關(guān)注于管理對(duì)象的狀態(tài)。 這就意味著對(duì)象的狀態(tài)存在于內(nèi)存,因此直接更新或者刪除 (使用 SQL 語句 UPDATEDELETE) 數(shù)據(jù)庫中的數(shù)據(jù)將不會(huì)影響內(nèi)存中的對(duì)象狀態(tài)和對(duì)象數(shù)據(jù)。 不過,Hibernate提供通過Hibernate查詢語言來執(zhí)行大批 量SQL風(fēng)格的(UPDATE)和(DELETE) 語句的方法。

          UPDATEDELETE語句的語法為: ( UPDATE | DELETE ) FROM? ClassName (WHERE WHERE_CONDITIONS)?。 有幾點(diǎn)說明:

          • 在FROM子句(from-clause)中,F(xiàn)ROM關(guān)鍵字是可選的

          • 在FROM子句(from-clause)中只能有一個(gè)類名,并且它不能有別名

          • 不能在大批量HQL語句中使用連接(顯式或者隱式的都不行)。不過在WHERE子句中可以使用子查詢。

          • 整個(gè)WHERE子句是可選的。

          舉個(gè)例子,使用Query.executeUpdate()方法執(zhí)行一個(gè)HQL UPDATE語句:

          Session session = sessionFactory.openSession();
                  Transaction tx = session.beginTransaction();
          
                  String hqlUpdate = "update Customer set name = :newName where name = :oldName";
                  int updatedEntities = session.createQuery( hqlUpdate )
                                      .setString( "newName", newName )
                                      .setString( "oldName", oldName )
                                      .executeUpdate();
                  tx.commit();
                  session.close();

          執(zhí)行一個(gè)HQL DELETE,同樣使用 Query.executeUpdate() 方法 (此方法是為 那些熟悉JDBC PreparedStatement.executeUpdate() 的人們而設(shè)定的)

          Session session = sessionFactory.openSession();
                  Transaction tx = session.beginTransaction();
          
                  String hqlDelete = "delete Customer where name = :oldName";
                  int deletedEntities = session.createQuery( hqlDelete )
                                      .setString( "oldName", oldName )
                                      .executeUpdate();
                  tx.commit();
                  session.close();

          Query.executeUpdate()方法返回的整型值表明了受此操作影響的記錄數(shù)量。 注意這個(gè)數(shù)值可能與數(shù)據(jù)庫中被(最后一條SQL語句)影響了的“行”數(shù)有關(guān),也可能沒有。一個(gè)大批量HQL操作可能導(dǎo)致多條實(shí)際的SQL語句被執(zhí)行, 舉個(gè)例子,對(duì)joined-subclass映射方式的類進(jìn)行的此類操作。這個(gè)返回值代表了實(shí)際被語句影響了的記錄數(shù)量。在那個(gè)joined-subclass的例子中, 對(duì)一個(gè)子類的刪除實(shí)際上可能不僅僅會(huì)刪除子類映射到的表而且會(huì)影響“根”表,還有可能影響與之有繼承關(guān)系的joined-subclass映射方式的子類的表。

          posted on 2007-03-19 00:23 EricWong 閱讀(1066) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 景德镇市| 旬邑县| 阿拉善左旗| 固镇县| 大丰市| 安多县| 关岭| 收藏| 芦溪县| 清远市| 平阳县| 定陶县| 土默特左旗| 蒙城县| 银川市| 海丰县| 嫩江县| 志丹县| 竹山县| 屯门区| 黄石市| 黄大仙区| 遂川县| 德庆县| 呼伦贝尔市| 炎陵县| 天祝| 乌苏市| 石家庄市| 浦城县| 鄄城县| 中宁县| 洛扎县| 弥渡县| 江油市| 麻城市| 田东县| 岐山县| 延津县| 涪陵区| 洛扎县|