我想使用hibernate执行本机/原始mysql查询,我有以下条件:
sessionFactory.getCurrentSession().createSQLQuery(
"update table1 set someCounter = someCounter + 1 where id = ?")
.setParameter(1, someId)
.executeUpdate();我得到了一个错误:
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这是怎么回事?
发布于 2012-10-26 09:44:36
使用索引作为索引,因为参数0从0开始。
sessionFactory.getCurrentSession()
.createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
.setParameter(0, someId)
.executeUpdate();由于您使用的是Hibernate,因此也可以使用命名参数。
sessionFactory.getCurrentSession()
.createSQLQuery("update table1 set someCounter = someCounter + 1 where id = :id")
.setParameter("id", someId)
.executeUpdate();发布于 2012-10-26 09:44:54
参数使用从零开始的索引。尝试:
sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
.setParameter(0, someId)
.executeUpdate();当前的Hibernate JavaDocs还指定setPosition依赖于位置参数的从零开始的索引。http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Query.html#setParameter%28int,%20java.lang.Object%29
setParameter
Query setParameter(int position,
Object val)
throws HibernateException
Bind a value to a JDBC-style query parameter. The Hibernate type of the parameter is first detected via the usage/position in the query and if not sufficient secondly guessed from the class of the given object.
Parameters:
position - the position of the parameter in the query string, numbered from 0.
val - the non-null parameter value
Throws:
HibernateException - if no type could be determined关于setParameter()方法是从0开始还是从1开始,一直有一些讨论。这种混乱是由于发帖者收到的异常,指出参数是以1为基础的,而JavaDoc则声明它们是以零为基础的。我分析了Hibernate的源代码,认为它们实际上是从零开始的。假设我选中了正确的类,底层代码使用列表来存储参数绑定值,这意味着setParameter方法实际上是从零开始的。自己签出源代码:https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/internal/AbstractQueryImpl.java
发布于 2012-10-26 12:13:16
Positional参数从0开始而不是从1开始
SQL
查询支持位置参数和命名参数:
通过在setParameter(1, someId)中传递0而不是1来更新查询
sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
.setParameter(0, someId)
.executeUpdate();资源parameters
https://stackoverflow.com/questions/13079683
复制相似问题