在Hibernate4中,利用原生SQL語句查詢時僧凰,
1探颈、可使用Session.createSQLQuery(sql)建立Qurey(org.hibernate.Query),
2允悦、可使用Query.setParameter(int index, Object obj),對sql語句中的參數(shù)根據(jù)位置進(jìn)行參數(shù)值動態(tài)綁定;
升級到Hibernate5后
1、org.hibernate.Query被標(biāo)記為@Deprecated
2隙弛、Session().createSQLQuery(sql)返回類型為org.hibernate.query.Query;
3架馋、并且Session().createSQLQuery也已經(jīng)被標(biāo)記為@Deprecated;
4全闷、可使用Session().createNativeQuery(sql)代替createSQLQuery叉寂。
5、createNativeQuery返回的Query,不可通過setParameter(int index, Object obj) 根據(jù)位置進(jìn)行參數(shù)值動態(tài)綁定总珠;只可以通過setParameter(String paramname, Object obj) 按參數(shù)名稱綁定屏鳍。
6、createNativeQuery(sql)中的sql語句中的查詢占位符
只可使用命名參數(shù)方式進(jìn)行編寫局服。
//正確例子:
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”);
上問錯誤例子中钓瞭,將導(dǎo)致如下錯誤:
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)