Hql參數占位符使用(轉+整理)


在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

jpa和hibernate的關系

 

轉+整理自:Hibernate4 HQL查詢占位符的問題 https://my.oschina.net/line926/blog/202869


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM