Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate执行更新索引自动边界_Java_Hibernate_Hql - Fatal编程技术网

Java hibernate执行更新索引自动边界

Java hibernate执行更新索引自动边界,java,hibernate,hql,Java,Hibernate,Hql,我正试图使用HQL在hibernate中执行一个简单的更新,但我似乎无法让它工作 我将查询模板定义为: private static final String CHANGE_DEVICE_STATUS = "UPDATE THING" +"SET ACTIVE = ? " +"WHERE ID = ?"; 然后我试着这样执行它: Session s = HibernateSessionFactory.getSession(); Query query = s.createQuery(CHA

我正试图使用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)
    ....
我做错了什么?我正在使用Hibernate3.0

更新

我把它改成了

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

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

以及我的查询代码:

Query query = s.createQuery(CHANGE_DEVICE_STATUS);
query.setBoolean("active", is_active);
query.setLong("id", device.getDeviceInstanceId());
query.executeUpdate();
现在我得到了这个异常(在调用executeUpdate时):


这可能会奏效:

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

这看起来像:

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

...
query.setBoolean("active", is_active);
query.setLong("id", id);
基于


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

Partridge您的案例与“ID”不匹配有什么原因吗?@Imz-wow真烦人,谢谢您帮我找到这个!。我尝试了所有不同的方法来创建查询,真是疯了。
Query query = s.createQuery(CHANGE_DEVICE_STATUS);
query.setBoolean("active", is_active);
query.setLong("id", device.getDeviceInstanceId());
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)
    ...
private static final String CHANGE_DEVICE_STATUS
= "UPDATE THING"
 +"SET ACTIVE = :active "
 +"WHERE ID = :id";

...
query.setBoolean("active", is_active);
query.setLong("id", id);