说出超出声明的序数参数数量的位置

时间:2012-10-26 01:39:49

标签: java hibernate

我想使用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

这里有什么问题?

4 个答案:

答案 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

查看本文档的参数部分:https://access.redhat.com/knowledge/docs/en-US/JBoss_Enterprise_Web_Server/1.0/html/Hibernate_Core_Reference_Guide/querysql.html#id3043464

有关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)

中传递0而不是1来更新您的查询
sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
                .setParameter(0, someId)
                .executeUpdate();

资源parameters

答案 3 :(得分:0)

对于那些无法根据上述解决方案进行解析的人,似乎有时处于休眠状态(取决于版本,我使用的是3)实际上给了您错误的错误,例如可能存在问题如果您在休眠q语言中犯了语法错误:

find("from Student s where s.id = :id")

将其更改为此:

find("from Student s where s.id = ?")

实际解决了该问题。我想我的主要观点是,您还应该查看问题的语法,因为休眠似乎可以错误地标记此异常。