当前位置: 首页 > 知识库问答 >
问题:

声明的顺序参数数量以外的位置

戚升
2023-03-14

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

这里怎么了?

共有3个答案

端木野
2023-03-14

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

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

更新您的查询通过传递0而不是1在setParameter(1,某物Id)

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

资源参数

孙佑运
2023-03-14

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

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

当前的HibernateJavadocs还指定setPosition依赖于基于零的位置参数索引。http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Query.html#setParameter(int,java.lang.Object)

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

阎建中
2023-03-14

使用index作为0,因为参数index从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();
 类似资料:
  • 我使用Spring Data JPA生成了一个非常简单的查询方法,但出现以下错误: 这是我的方法: 有什么想法吗?这让我特别困扰,因为我以前写过数百个这样的查询,而这个看起来非常正常。

  • 我想执行mysql插入查询使用Hibernate,我有这个: 我发生了以下异常:, 线程“main”组织中出现异常。冬眠QueryParameterException:位置超出已声明序数参数的数量。请记住,序数参数是基于1的!职位:1 这里怎么了?

  • 登录库 服务函数 登录控制器 错误 我实际上在这里检查日志记录时输入的数据是否存在于数据库中。如果数据为,那么list将为,并将其发送回登录到主页。有人能帮我吗?

  • 我有一个Hibernate Web应用程序,目前正在tomcat/CloudFoundry上运行,但当我尝试在JBoss上运行它时,我遇到了一些错误。 在我的DAO中,我创建了一个查询来按用户名加载用户,如下所示: 当我在Tomcat上运行应用程序时,上面的方法是有效的,但是当我在JBoss上运行应用程序时,我得到了以下错误: 我已经尝试更改为以下两个问题,但仍然没有成功: 上面给我同样的错误。因

  • 我想执行我的选择查询, @查询(value=“select*from data o,其中o.id=:id”,nativeQuery=true) 公共列表查找列表(整数id); 获取非法参数异常, 位置超出已声明顺序参数的数量。请记住,序数参数是基于1的!职位:1

  • 问题内容: 为什么这些示例中的第一个不起作用,而其他所有示例都起作用? 问题答案: 这既不是范围问题,也不是关闭问题。问题在于 声明 和 表达式 之间的理解。 JavaScript代码(即使是Netscape的第一个JavaScript版本和Microsoft的第一个副本)也要分两个阶段处理: 阶段1:编译-在此阶段,代码被编译成语法树(字节码或二进制取决于引擎)。 阶段2:执行-然后解析解析的代