hibernate native sql的小技巧

          為了性能考慮,使用了 native sql 。因為需要分頁,需要 2 sql ,一個獲取 list 一個取得總數(shù)。獲取 list 很好寫:

          ?

          ?1 private ?List?getListByNativeSQL( final ?Class?cls,? final ?String?sql)? {
          ?2
          ?3 ??????? return ?(List)?getHibernateTemplate().execute( new ?HibernateCallback()? {
          ?4
          ?5 ??????????? public ?Object?doInHibernate(Session?session)
          ?6
          ?7 ?????????????????? throws ?HibernateException? {
          ?8
          ?9 ?????????????? return ?session.createSQLQuery(sql).addEntity(cls).list();
          10
          11 ???????????}

          12
          13 ???????}
          );
          14
          15 ????}

          16

          ?

          獲取總數(shù)查了下 hibernate reference, 試了幾次才明白用法 :

          ?1 private ?BigInteger?getCountByNativeSQL( final ?String?sql)? {
          ?2
          ?3 ??????? return ?(BigInteger)?getHibernateTemplate().execute(
          ?4
          ?5 ?????????????? new ?HibernateCallback()? {
          ?6
          ?7 ?????????????????? public ?Object?doInHibernate(Session?session)
          ?8
          ?9 ????????????????????????? throws ?HibernateException? {
          10
          11 ????????????????????? return ?(BigInteger)?(session.createSQLQuery(sql).uniqueResult());
          12
          13 ??????????????????}

          14
          15 ??????????????}
          );
          16
          17 ????}

          18

          這里的

          sql 是“ select count(*) 開頭的”。這里大家可能要問,為什么要使用 BigInteger ,因為如果用 uniqueResult() 默認(rèn)就返回 BigInteger ,而 BigInteger cast Integer 會出錯。那么如果我就是要返回 Integer 呢,可以通過下面的辦法實現(xiàn):

          ?1 private ?Integer?getCountByNativeSQL( final ?String?sql)? {
          ?2
          ?3 ??????? return ?(Integer)?getHibernateTemplate().execute(
          ?4
          ?5 ?????????????? new ?HibernateCallback()? {
          ?6
          ?7 ?????????????????? public ?Object?doInHibernate(Session?session)
          ?8
          ?9 ????????????????????????? throws ?HibernateException? {
          10
          11 ????????????????????? return ?(Integer)?(session.createSQLQuery(sql).addScalar( " count " ,?Hibernate.INTEGER).uniqueResult());
          12
          13 ??????????????????}

          14
          15 ??????????????}
          );
          16
          17 ????}

          18

          大家注意粗體的部分,這里是給一個

          alias 賦予類型,那么 sql 就需要變成以 ”select count(*) as count ” 開頭了。

          posted on 2007-03-02 10:52 pesome 閱讀(5267) 評論(2)  編輯  收藏 所屬分類: 開源軟件

          評論

          # re: hibernate native sql的小技巧 2007-03-23 16:40 StormSpire

          也可以考慮用 projection 的 rowCount() 方法實現(xiàn)  回復(fù)  更多評論   

          # re: hibernate native sql的小技巧 2007-11-09 12:55 itbeta

          前兩天也踫到這個問題,更好辦法是使用轉(zhuǎn)換為Number,再用.intValue()方法取數(shù):((Number)result).intValue();  回復(fù)  更多評論   

          <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計

          公告

          主要記錄作者在學(xué)習(xí)java中的每一步足跡。除非特別說明,所有文章均為本blog作者原創(chuàng),如需轉(zhuǎn)載請注明出處和原作者,如用于商業(yè)目的,需跟作者本人聯(lián)系。
          歡迎大家訪問:

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          java技術(shù)

          人間百態(tài)

          朋友們的blog

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 蕲春县| 兴化市| 茶陵县| 赣榆县| 武清区| 洞口县| 穆棱市| 筠连县| 涿州市| 上饶县| 湖北省| 唐山市| 集安市| 东至县| 鞍山市| 开鲁县| 凤城市| 宁城县| 探索| 澄城县| 麻栗坡县| 淮阳县| 兰考县| 大安市| 洪雅县| 介休市| 大竹县| 滦平县| 五指山市| 如东县| 乐至县| 安平县| 仙游县| 民丰县| 获嘉县| 武陟县| 天等县| 潞西市| 酉阳| 奎屯市| 通辽市|