我想使用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
这里有什么问题?
答案 0 :(得分:13)
将索引用作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();
答案 1 :(得分:3)
参数使用基于零的索引。尝试:
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()方法是基于零还是基于一种的讨论。这种混淆是由于海报收到的异常,指出参数是基于1的,而JavaDoc声称它们是基于零的。我分析了Hibernate源代码,并认为它们实际上是零基础的。假设我检查了正确的类,底层代码使用一个列表来存储参数绑定值,这意味着setParameter方法实际上是基于零的。自行查看源代码:https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/internal/AbstractQueryImpl.java
答案 2 :(得分:0)
Positional
参数从0
而非1
本机SQL查询支持位置和命名参数:
通过在setParameter(1, someId)
sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
.setParameter(0, someId)
.executeUpdate();
答案 3 :(得分:0)
对于那些无法根据上述解决方案进行解析的人,似乎有时处于休眠状态(取决于版本,我使用的是3)实际上给了您错误的错误,例如可能存在问题如果您在休眠q语言中犯了语法错误:
find("from Student s where s.id = :id")
将其更改为此:
find("from Student s where s.id = ?")
实际解决了该问题。我想我的主要观点是,您还应该查看问题的语法,因为休眠似乎可以错误地标记此异常。