休眠executeUpdate IndexOutOfBounds [英] hibernate executeUpdate IndexOutOfBounds

查看:75
本文介绍了休眠executeUpdate IndexOutOfBounds的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用HQL在休眠状态下执行简单的更新,但是我似乎无法使其正常工作.

I am trying to use an HQL to perform a simple update in hibernate, but i can't seem to get it to work.

我的查询模板定义为:

private static final String CHANGE_DEVICE_STATUS
= "UPDATE THING"
 +"SET ACTIVE = ? "
 +"WHERE ID = ?";

然后我尝试像这样执行它:

and then i try to execute it like this:

Session s = HibernateSessionFactory.getSession();
Query query = s.createQuery(CHANGE_DEVICE_STATUS);
query.setBoolean(0, is_active);
query.setLong(1, id);
query.executeUpdate();

但是现在我得到了这个错误:

But now i get this error:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
 at java.util.ArrayList.RangeCheck(ArrayList.java:547)
 at java.util.ArrayList.get(ArrayList.java:322)
 at org.hibernate.hql.ast.HqlSqlWalker.postProcessUpdate(HqlSqlWalker.java:390)
 at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:164)
 at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:189)
 at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:130)
 at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)
 at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)
 at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
 at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:865)
 at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:89)
    ....

我在这里做错了什么?我正在使用休眠3.0

what am i doing wrong here? I am using hibernate 3.0

更新

我将其更改为

Query query = s.createQuery(CHANGE_DEVICE_STATUS);
query.setBoolean(1, is_active);
query.setLong(2, id);//<---throws here
query.executeUpdate();

除了参数索引外没有改变其他任何东西,我得到了:

without changing anything else but the parameter indexes and i got this:

java.lang.IllegalArgumentException: Positional parameter does not exist: 2 in query: 
UPDATE DEVICE_INSTANCES SET ACTIVE = ? WHERE DEVICE_INSTANCE_ID = ?
 at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:194)
 at org.hibernate.impl.AbstractQueryImpl.setLong(AbstractQueryImpl.java:244)
    ...

更新2

现在我正在尝试命名参数,所以我将查询更改为此(根据建议)

Now I'm trying named parameters, so i changed the query to this (as per the suggestion)

private static final String CHANGE_DEVICE_STATUS
= "UPDATE DEVICE_INSTANCES "
 +"SET ACTIVE = :active "
 +"WHERE DEVICE_INSTANCE_ID = :id";

和我的查询代码为:

Query query = s.createQuery(CHANGE_DEVICE_STATUS);
query.setBoolean("active", is_active);
query.setLong("id", device.getDeviceInstanceId());
query.executeUpdate();

现在我得到了这个异常(在对executeUpdate的调用上):

and now i get this exception (on the call to executeUpdate):

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at org.hibernate.hql.ast.HqlSqlWalker.postProcessUpdate(HqlSqlWalker.java:390)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:164)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:189)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:130)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)
    at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)
    at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
    at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:865)
    at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:89)
    ...

推荐答案

基于 https://forum.hibernate.org/viewtopic.php?f=1&t=945694&view=上一个

尝试将FROM添加到HQL更新中,例如UPDATE FROM THING SET ACTIVE = ? WHERE ID = ?.同样,正如您所发现的,参数从0开始.这不是JDBC.

Try adding FROM to the HQL update e.g. UPDATE FROM THING SET ACTIVE = ? WHERE ID = ?. Also, parameters start at 0, as you have discovered. This is not JDBC.

这篇关于休眠executeUpdate IndexOutOfBounds的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆