<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xskow's road.

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

        
    //getters and setters

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


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

    評論

    # re: 關于Hibernate Native sql query的詭異問題 2009-12-17 21:54 動動

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

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

    @動動
    我估計要是你連表的時候有字段名字相同就不行了,最后我還是用了hql解決的。如果連表時候要查的字段名字不一樣就不會有問題。哎。。。
      回復  更多評論    

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

    哎,我來回答下。這個需要增加別名來回避。為了后人
    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);

    注意一點是別名不能是mysql 關鍵字,否則會報錯

    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: 關于Hibernate Native sql query的詭異問題 2012-09-04 23:01 雙方

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

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

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

    對全部或者部分的標量值不設置類型信息也是可以的。

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

    關于從ResultSetMetaData返回的java.sql.Types是如何映射到Hibernate類型,是由方言(Dialect)控制的。假若某個指定的類型沒有被映射,或者不是你所預期的類型,你可以通過Dialet的registerHibernateType調用自行定義.
      回復  更多評論    
    links:
    主站蜘蛛池模板: 无遮挡a级毛片免费看| 五月亭亭免费高清在线| 成人妇女免费播放久久久| 亚洲一区免费视频| 亚洲黄色网址在线观看| 青娱乐在线视频免费观看| aⅴ免费在线观看| 亚洲精品在线免费看| 国产精品永久免费视频| 久久久久成人片免费观看蜜芽 | 亚洲国产成人久久综合碰| 亚洲视频在线观看免费视频| 一级毛片全部免费播放| 亚洲欧洲国产视频| 成人无码区免费A∨直播| 久久夜色精品国产亚洲av| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲国产成+人+综合| 久久九九免费高清视频| 亚洲老妈激情一区二区三区| 亚洲第一综合天堂另类专| 国产大片免费网站不卡美女| 久久精品国产亚洲AV麻豆不卡 | 一级视频在线免费观看| 成人免费无码大片a毛片软件 | 亚洲精品国产第一综合99久久| 国产成人免费全部网站| 国产99在线|亚洲| 一级毛片不卡片免费观看| 亚洲福利秒拍一区二区| 精品免费国产一区二区| 亚洲伊人久久大香线蕉AV| 免费H网站在线观看的| 久久久久亚洲精品日久生情 | 大学生一级毛片免费看| 亚洲春色在线观看| 国产精品黄页在线播放免费| 黄色网站软件app在线观看免费| 亚洲人成人无码网www电影首页| 中文字幕成人免费高清在线| 亚洲另类视频在线观看|