【问题标题】:hibernate executeUpdate IndexOutOfBounds休眠执行更新 IndexOutOfBounds
【发布时间】:2010-06-10 23:31:19
【问题描述】:

我正在尝试使用 HQL 在 hibernate 中执行简单的更新,但我似乎无法让它工作。

我有一个查询模板定义为:

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

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

Session s = HibernateSessionFactory.getSession();
Query query = s.createQuery(CHANGE_DEVICE_STATUS);
query.setBoolean(0, is_active);
query.setLong(1, id);
query.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)
    ....

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

更新

我改成

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

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

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

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

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 时):

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)
    ...

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

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

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

    【讨论】:

    • @Imz wow 真烦人,谢谢你帮我追踪这个!我疯了,尝试了所有不同的方法来创建查询。
    【解决方案2】:

    这可能会起作用:

    您可以使用字符串来定义参数(这是我选择的方法,因为它更易于阅读)

    这看起来像:

    private static final String CHANGE_DEVICE_STATUS
    = "UPDATE THING"
     +"SET ACTIVE = :active "
     +"WHERE ID = :id";
    
    ...
    query.setBoolean("active", is_active);
    query.setLong("id", id);
    

    【讨论】:

    • Partridge 您的案例与“ID”不匹配是否有原因?
    猜你喜欢
    • 2012-04-24
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2012-10-17
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多