項(xiàng)目中Hibernate的版本之前是3點(diǎn)幾的,后面由于spring升級(jí)到5不得不把hibernate也升級(jí)到了5(5.2.13.Final)集成之后發(fā)現(xiàn)一大堆Deprecated的提示,其中較多的地方就是Query問(wèn)題,舊版的用的是:
org.hibernate.Query
我看到這個(gè)對(duì)象已經(jīng)被Deprecated掉了,已經(jīng)被:
org.hibernate.query.Query
替換掉了,想到以后混用的話(huà)維護(hù)起來(lái)麻煩,一狠心把所有的org.hibernate.Query都替換掉了
然而問(wèn)題來(lái)了,以前遺留的代碼中用position設(shè)置參數(shù)的地方出了問(wèn)題:
query.setParameter(0, name);
我本以為是下標(biāo)不是從0開(kāi)始的,換成1也是有問(wèn)題。后來(lái)發(fā)現(xiàn)是這個(gè)方法只能對(duì)原生sql進(jìn)行綁定,不能對(duì)HQL參數(shù)進(jìn)行綁定,這就讓我忍不住吐槽了,升級(jí)了新版本居然不兼容舊版本,但是既然都換,了,也只能硬著頭皮把所有的地方都用名稱(chēng)綁定的方式替換掉了:
String sql = "select bean from TDtl bean where bean.billno=:billno";
Query query = getSession().createQuery(sql);
query.setParameter("billno", billno);
這種坑我真的不想多說(shuō)什么,hibernate5很多寫(xiě)法都換了,其中一個(gè)更坑的地方,把查詢(xún)結(jié)果轉(zhuǎn)換成其他對(duì)象的方法(項(xiàng)目中多處用到):
/**
* Set a strategy for handling the query results. This can be used to change
* "shape" of the query result.
*
* @param transformer The transformer to apply
*
* @return this (for method chaining)
*
* @deprecated (since 5.2)
* @todo develop a new approach to result transformers
*/
@Deprecated
Query<R> setResultTransformer(ResultTransformer transformer);
被Deprecated我就不說(shuō)什么了,我以為你有替代的方法,結(jié)果直接給我來(lái)了個(gè)todo,無(wú)語(yǔ)凝噎。所以這個(gè)方法還在用,只能等它什么時(shí)候有替換了再說(shuō)。