在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>,不過這種方式到沒有試過,不知是否可行!