在工作中發現這樣的問題:在Oracle的10g之前的版本,存在一個bug,即用PreparedStatement預先處理去動態查詢資料時,用預留位置?代替的欄位,如果是char類型的,那麼在執行時用來代替?的變數必須和該欄位的長度相同,如果欄位長度不足,用空格補充夠的位元,否則查詢不到正確的結果。如果該欄位不是char類型的就不存在這樣的問題。
昨天出了一個奇怪的問題,hibernate通過實體Id(char(10)型)取得資料,session.find("from TableName where id=?","value");
取不到資料,但資料庫裡是有這個條資料。真奇怪,後來用pl/sql看資料庫,滑鼠點到Id那時,可以看到內容後面還有一些空格,帶著期望與質疑把欄位裡的值自製過來, session.find("from TableName where id=?","value ");後發現可以。
我特別試了下connection.createStatement("select * from table_name where id='value'");
則正常取資料,session.find("from TableName where id=?","value");
而卻找不到資料,然後又試了下
ptmt = connection.prepareStatement(select * from table_name where id=?");
ptmt.setString(1,"year");
這樣也不行,以是結論是:jdbc驅動PrepareStatement對char欄位類型的尋找問題,因為hibernate是用PrepareStatement的,自然,hibernate對char對應的屬性條件尋找出現找不到的情況,
解決辦法是:
1.屬性用TRIM函數處理:session.find("from TableName where TRIM(id)=?","value");
2.char改為varchar2類型
今天試了下mysql,它不會這樣的情況,所以結論是:Oracle JDBC PreparedStatement的bug(有可能它故意這樣)