PreparedStatement,hibernate查詢oracle char類型解決方案

來源:互聯網
上載者:User

在oracle中執行以下sql
create table A (
id char(5)
);
insert into A values('11');

使用以下java代碼查詢該記錄

String sql="select * from A where id=?";
pstm=conn.prepareStatement(sql);
pstm.setString(1,"11");
rs=pstm.executeQuery();
System.out.println(rs.next());

呵呵...是不是查不到任何東西啊,將sql改掉看看:

String sql="select * from A where trim(id)=?";

是不是查出來了,哈!,可是能不能不用trim()就能查出來呢?
那是可以的!
請看代碼:

String sql="select * from A where id=?";
pstm=conn.prepareStatement(sql);
((OraclePreparedStatement)pstm).setFixedCHAR(1, "11");
rs=ps.executeQuery();
System.out.println(rs.next());

執行看看,查詢成功!
這是為什麼呢,由於我英文水平不好,所以請開啟以下連結看看!
http://forums.oracle.com/forums/thread.jspa;jsessionid=8d92200630de527b2f61c7ef4d3296318c855aa88fe1.e34Tb34Lb34PbO0Lb3eTahiPbNyTe0?messageID=504702

對於hibernate查詢oracle char類型可謂是遇到大麻煩了,因為hibernate內部使用的是PrepareStatement,在查詢oracle char類型時會出現上述的問題,我的解決方案是定義一個UserType,該UserType對欄位值自動補齊空格,以下是我的配製檔案樣本:

<id name="id">
   <column name="id"/>
   <type name="test.OracleCharType">
    <param name="length">5</param>
   </type>
   <generator class="assigned" />
</id>

test.OracleCharType就是我自訂的UserType類,它實現了當我們傳進來的id值少於5位時,自動加空格,使id值滿足5位.
這樣,當我們使用以下語句擷取對象,便能擷取到了.

session.get(A.class,"11")

它底層的查詢語句會轉換成
select * from A where id='11   ';

怎麼樣,明白了不.你可能會說為什麼使用加空格而不使用trim()函數截取的方式,那是因為hibernate的UserType只能對欄位值做手腳(如:'11'變成了'11   ').
這種方案只需要定義一個UserType,然後在hbm檔案裡配製一下就可使用了.
當然這隻是其中一種解決方案,如果你不嫌麻煩的話,可以將查詢都改成hql+trim()的方式查詢,那麼工作量會加很多.
也可以為每個po對象加一個<sql-query></sql-query>,不過這種方式到沒有試過,不知是否可行!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.