xskow's road.

          做好自己,做好一切。
          數(shù)據(jù)加載中……
          關(guān)于Hibernate Native sql query的詭異問題
                  當(dāng)要做連表查詢時(shí),比如a和b,如果a1和b1都有一個(gè)name字段,使用下面的sql語句:
                  select a.name, b.name from a1 a, b1 b
                  假設(shè)不作任何處理,毫無疑問返回的是object[]的List,object[0]是a.name, object[1]是b.name。但是,咋們想錯(cuò)了。。。object[0]和object[1]一樣是a.name,開始認(rèn)為是hibernate調(diào)用jdbc的resultset時(shí)使用了如getString("name")這樣的東東,所以得到的都是第0個(gè)值。好吧,加個(gè)別名試試:
                  select a.name as name1, b.name as name2 from a1 a, b1 b
                  這好像可以呀。。。但是卻報(bào)錯(cuò),找不到name列。。。
                  好吧,來個(gè)ResultTransformer吧!假設(shè)轉(zhuǎn)換目標(biāo)類為TestDTO.class:
          public class TestDTO{
              
          private String name1;
              
          private String name2;

              
          //getters and setters

          }
                  這回應(yīng)該好了吧?還是一樣的錯(cuò)誤。。。
                  注意:使用ResultTransformer的時(shí)候,別名注射不能用{name1}這種形式的,這種形式只適用于addEntity的情況!
                  為什么我要用sql查詢?由于特殊情況,我使用一些和數(shù)據(jù)庫有依賴的函數(shù),以后轉(zhuǎn)數(shù)據(jù)庫要是知道不兼容也肯定是sql那塊的,而不是hql,解決問題就方便多了。(注:hql一樣可以用特定數(shù)據(jù)庫的函數(shù))而且我連的是多個(gè)表,每個(gè)表字段十來個(gè),如果用實(shí)體查詢的話,每一行就是三個(gè)對(duì)象,而我需要的只是5個(gè)字段而已。而且如果可以用ResultTransformer的話,操作起來也十分方便。
                  不知道有誰也遇到過同樣問題?還是說大家都不用hibernate進(jìn)行sql查詢,不管是什么情況?
                  得再次研究hibernate官方文檔了。。。從文檔的那一章中,完全沒有找到有同名字段然后又使用ResultTransformer的情況。。。


          posted on 2009-06-11 09:57 xskow! 閱讀(975) 評(píng)論(4)  編輯  收藏 所屬分類: SSH探索

          評(píng)論

          # re: 關(guān)于Hibernate Native sql query的詭異問題 2009-12-17 21:54 動(dòng)動(dòng)

          碰到了同樣的問題 沒解決 ,你的解決了嗎?如果解決了 可以告知嗎?
          先謝過。
          我的郵箱:xiangdong.liu@kvect.com

          # re: 關(guān)于Hibernate Native sql query的詭異問題 2009-12-19 12:19 Mickey.Shao

          @動(dòng)動(dòng)
          我估計(jì)要是你連表的時(shí)候有字段名字相同就不行了,最后我還是用了hql解決的。如果連表時(shí)候要查的字段名字不一樣就不會(huì)有問題。哎。。。

          # re: 關(guān)于Hibernate Native sql query的詭異問題 2012-09-04 22:59 雙方

          哎,我來回答下。這個(gè)需要增加別名來回避。為了后人
          String sql1 = "select l.pos_id,l.id as add2 from launch l where l.id=2734837";
          Object list1 = baseDao.createSQLQuery(sql1).addScalar("add2").uniqueResult(); // 失敗
          System.out.println(list1);

          注意一點(diǎn)是別名不能是mysql 關(guān)鍵字,否則會(huì)報(bào)錯(cuò)

          Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'add from launch l where l.id=2734837' at line 1

          # re: 關(guān)于Hibernate Native sql query的詭異問題 2012-09-04 23:01 雙方

          @雙方
          注意要增加這個(gè) addScalar("add2")
          http://blog.csdn.net/wfm0105/article/details/6567476

          1.1標(biāo)量查詢
          最基本的SQL查詢就是獲得一個(gè)標(biāo)量(數(shù)值)的列表。
          1sess.createSQLQuery("SELECT * FROM CATS").list();
          2sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
          將返回一個(gè)Object數(shù)組(Object[])組成的List,數(shù)組每個(gè)元素都是CATS表的一個(gè)字段值。Hibernate會(huì)使用ResultSetMetadata來判定返回的標(biāo)量值的實(shí)際順序和類型。
          如果要避免過多的使用ResultSetMetadata,或者只是為了更加明確的指名返回值,可以使用addScalar()。

          1sess.createSQLQuery("SELECT * FROM CATS")
          2 .addScalar("ID", Hibernate.LONG)
          3 .addScalar("NAME", Hibernate.STRING)
          4 .addScalar("BIRTHDATE", Hibernate.DATE)
          這個(gè)查詢指定了:SQL查詢字符串,要返回的字段和類型.它仍然會(huì)返回Object數(shù)組,但是此時(shí)不再使用ResultSetMetdata,而是明確的將ID,NAME和BIRTHDATE按照Long, String和Short類型從resultset中取出。同時(shí),也指明了就算query是使用*來查詢的,可能獲得超過列出的這三個(gè)字段,也僅僅會(huì)返回這三個(gè)字段。

          對(duì)全部或者部分的標(biāo)量值不設(shè)置類型信息也是可以的。

          1sess.createSQLQuery("SELECT * FROM CATS")
          2 .addScalar("ID", Hibernate.LONG)
          3 .addScalar("NAME")
          4 .addScalar("BIRTHDATE")
          基本上這和前面一個(gè)查詢相同,只是此時(shí)使用ResultSetMetaData來決定NAME和BIRTHDATE的類型,而ID的類型是明確指出的。

          關(guān)于從ResultSetMetaData返回的java.sql.Types是如何映射到Hibernate類型,是由方言(Dialect)控制的。假若某個(gè)指定的類型沒有被映射,或者不是你所預(yù)期的類型,你可以通過Dialet的registerHibernateType調(diào)用自行定義.
          links:
          主站蜘蛛池模板: 遂宁市| 花莲市| 太仓市| 安化县| 安顺市| 高邮市| 博湖县| 忻城县| 和田县| 云霄县| 晋宁县| 手机| 婺源县| 南漳县| 旌德县| 永州市| 孟州市| 开化县| 河津市| 施甸县| 诸暨市| 康平县| 长兴县| 泾川县| 福州市| 凉城县| 绥阳县| 满洲里市| 东台市| 博野县| 当阳市| 奎屯市| 上栗县| 韩城市| 塔河县| 霞浦县| 平南县| 江永县| 涟源市| 新津县| 霍林郭勒市|