在Hibernate 4版本中,對於Hql有一點點改變,如果你還是按照以前的方式去編寫HQL Query query = sessionFactory.openSession().createQuery("from User u where u.name = ?") .setParamter(0,"line");就會得到一個警告。
得到的警告:
[DEPRECATION] Encountered positional parameter near line 1, column 95. Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.
//按上面提示的意思,它不提倡我們用這樣的方式適用占位符,而是建議用JPA或者命名參數的占位符:
1: 命名參數的方式
Query query = sessionFactory.openSession().createQuery("from User u where u.name =:name"); query.setParamter("name","line");
2: JPA(java persistens api)的方式
參考資料:https://hibernate.atlassian.net/browse/HHH-8012?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
// 有問題的jpa方式 Query query = sessionFactory.openSession().createQuery("from User u where u.name =?0") query.setParamter(0,"line"); //?后面的數字是可以隨意的,不必要從0開始
上面的方式會得到一個異常信息:
threw exception [Request processing failed; nested exception is org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 2] with root cause
org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 2
這是由於Query是有hibernate封裝好的session中獲取的,所以我們不能按照jpa的方式來寫:
// 調用的是setParmter(string,string)的方法,而不是setParmter(int,string) Query query = sessionFactory.openSession().createQuery("from User u where u.name =?0") query.setParamter("0","line"); //?后面的數字是可以隨意的,不必要從0開
3:more things
轉+整理自:Hibernate4 HQL查詢占位符的問題 https://my.oschina.net/line926/blog/202869