我想使用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
这里怎么了?
Positional
参数从0
开始,而不是1
本机SQL查询支持位置参数和命名参数:
更新您的查询通过传递0而不是1在setParameter(1,某物Id)
sessionFactory.getCurrentSession().createSQLQuery("update table1 set someCounter = someCounter + 1 where id = ?")
.setParameter(0, someId)
.executeUpdate();
资源参数
参数使用从零开始的索引。尝试:
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
使用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:执行-然后解析解析的代