代码之家  ›  专栏  ›  技术社区  ›  luke

hibernate executeUpdate索引自动边界

  •  1
  • luke  · 技术社区  · 14 年前

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

    我做错什么了?我正在使用Hibernate3.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)
        ...
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   lmz    14 年前

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

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

        2
  •  0
  •   partkyle    14 年前

    这可能会起作用:

    这看起来像:

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