首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >说明位置超出了已声明的序数参数的数目

说明位置超出了已声明的序数参数的数目
EN

Stack Overflow用户
提问于 2012-10-26 09:39:49
回答 4查看 46.5K关注 0票数 9

我想使用hibernate执行本机/原始mysql查询,我有以下条件:

代码语言:javascript
复制
 sessionFactory.getCurrentSession().createSQLQuery(
       "update table1 set someCounter = someCounter + 1 where id = ?")
     .setParameter(1, someId)
     .executeUpdate();

我得到了一个错误:

代码语言:javascript
复制
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

这是怎么回事?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-26 09:44:36

使用索引作为索引,因为参数00开始。

代码语言:javascript
复制
sessionFactory.getCurrentSession()
  .createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
  .setParameter(0, someId)
  .executeUpdate();

由于您使用的是Hibernate,因此也可以使用命名参数。

代码语言:javascript
复制
sessionFactory.getCurrentSession()
  .createSQLQuery("update table1 set someCounter = someCounter + 1 where id = :id")
  .setParameter("id", someId)
  .executeUpdate();
票数 18
EN

Stack Overflow用户

发布于 2012-10-26 09:44:54

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

代码语言:javascript
复制
 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

代码语言:javascript
复制
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()方法是从0开始还是从1开始,一直有一些讨论。这种混乱是由于发帖者收到的异常,指出参数是以1为基础的,而JavaDoc则声明它们是以零为基础的。我分析了Hibernate的源代码,认为它们实际上是从零开始的。假设我选中了正确的类,底层代码使用列表来存储参数绑定值,这意味着setParameter方法实际上是从零开始的。自己签出源代码:https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/internal/AbstractQueryImpl.java

票数 4
EN

Stack Overflow用户

发布于 2012-10-26 12:13:16

Positional参数从0开始而不是从1开始

SQL

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

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

代码语言:javascript
复制
sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
                .setParameter(0, someId)
                .executeUpdate();

资源parameters

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13079683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档