9

我想使用休眠执行本机/原始 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

4 回答 4

18

使用索引,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-26T01:44:35.887 回答
4

参数使用从零开始的索引。尝试:

 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

于 2012-10-26T01:44:54.403 回答
0

Positional参数从0not开始1

本机 SQL 查询支持位置参数和命名参数:

通过传递 0 而不是 1 来更新您的查询setParameter(1, someId)

sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
                .setParameter(0, someId)
                .executeUpdate();

资源参数

于 2012-10-26T04:13:15.933 回答
0

对于那些无法根据上述解决方案解决的人来说,似乎有时休眠(取决于版本,我使用的是 3)实际上会给您错误的错误,例如,如果您让hibernate q 语言中的语法错误:

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

将其更改为:

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

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

于 2019-08-16T15:37:26.327 回答