будьте в спящем режиме executeUpdate IndexOutOfBounds

Я пытаюсь использовать HQL для выполнения, простое обновление в в спящем режиме, но я, может казаться, не заставляю это работать.

мне определили шаблон запроса как:

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)
    ...
1
задан luke 10 June 2010 в 23:46
поделиться

2 ответа

На основе https://forum.hibernate.org/viewtopic.php?f=1&t=945694&view=previous

Попробуйте добавить FROM в обновление HQL, например ОБНОВЛЕНИЕ ОТ THING SET ACTIVE =? ГДЕ ID =? . Кроме того, как вы обнаружили, параметры начинаются с 0. Это не JDBC.

2
ответ дан 2 September 2019 в 23:49
поделиться

Это, вероятно, будет работать:

Вы можете использовать строки для определения параметров (это мой метод, так как его легче читать)

Это будет выглядеть так:

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

...
query.setBoolean("active", is_active);
query.setLong("id", id);
0
ответ дан 2 September 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: