在Hibernate4中,利用原生SQL语句查询时,
1、可使用Session.createSQLQuery(sql)建立Qurey(org.hibernate.Query),
2、可使用Query.setParameter(int index, Object obj),对sql语句中的参数根据位置进行参数值动态绑定;
升级到Hibernate5后
1、org.hibernate.Query被标记为@Deprecated
2、Session().createSQLQuery(sql)返回类型为org.hibernate.query.Query;
3、并且Session().createSQLQuery也已经被标记为@Deprecated;
4、可使用Session().createNativeQuery(sql)代替createSQLQuery。
5、createNativeQuery返回的Query,不可通过setParameter(int index, Object obj) 根据位置进行参数值动态绑定;只可以通过setParameter(String paramname, Object obj) 按参数名称绑定。
6、createNativeQuery(sql)中的sql语句中的查询占位符
只可使用命名参数方式进行编写。
//正确例子:
Query query=session.createNativeQuery(“from User user where user.name=:name ”);
query.setParameter(name,“A”);
//错误例子:
Query query=session.createNativeQuery(“from User user where user.name=? ”);
query.setParameter(0,“A”);
上问错误例子中,将导致如下错误:
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Unknown parameter position: 0
at org.hibernate.query.internal.QueryParameterBindingsImpl.getBinding(QueryParameterBindingsImpl.java:223)
at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:499)
at org.hibernate.query.internal.NativeQueryImpl.setParameter(NativeQueryImpl.java:588)
at org.hibernate.query.internal.NativeQueryImpl.setParameter(NativeQueryImpl.java:52)