以下是我在hibernate查詢(通過Spring)中碰到的一個小問題及其解決方法,簡單但實用,希望也有益于各同友。
在用hibernate查詢中假如用到一個帶中文的參數,如:







在執行過程中在eclpise的console臺中可以看到hibernate經過底層將其譯成SQL后成了:
select ... from Customer user? where 1=1 and userr.hh like '%??????%'
的樣子。我試過將其以不同的方式編碼,可是都沒有將其最終以正確的結果返回。暫且不談此方法應該如何寫,我主要是想說通過用另外一種查詢方法:在HQL中綁定參數預編譯機制來解決這個亂碼問題。
參數綁定機制有如下優點:
a 安全感,防止惡意用戶非法調用DB的存儲過程
b 利用底層數據庫編譯SQL的功能,提高數據庫查詢性能。預編譯是指底層數據庫系統只能編譯SQL語句一次,把編譯出來的可執行代碼保存在緩存中,如果有多次執行相同的SQL語句,不需要重新編譯,只要從緩存中讀取即可。
將上面的執行過程改成如下:


















這樣就可以看到在console中最后所執行的SQL:
select ... from Customer user? where 1=1 and userr.mc like '%惠止南國%'
在上面中有這樣的語句:
qry.setParameter(i, objs[i]);
這是屬于按參數位置綁定中的綁定任意的參數類型。
org.hibernate.Query的參數綁定形式可以分為
1 按參數位置綁定
2 按參數位置綁定
Query綁定參數類型可以分為:
1 參數與持久化類實體綁定








2 綁定任意類型參數
上面中的qry.setParameter(...)就是這種類型,我們qry.setParameter(i, objs[i]);中是省略了第三個參數即Hibernate映射類型,如:
qry.setParameter(i, objs[i],Hibernate.STRING);
對于有些參數,Hibernate能根據參數值的java類型推斷出對應的映射類型,此時不再要在setParameter()中顯式指定映射類型。如上
3 將命名參數與一個對象屬性綁定
setProperties()方法
個人覺得這個跟ORM技術的ibatis中的SQLMAP有些許相似。它是用setProperties()方法。如:








Attention:對于日期型數據不能用setProperties()方法通過實體來綁定。
?