Настройка списка в спящем запросе Hibernate не работает

0

Я новичок в Hibernate и основываясь на документации для собственного запроса, я ожидал, что следующий код будет выполнен.

public boolean markStatusById(List<Integer> list, String newStatus) throws Exception {
        boolean statusUpdated = false;
        try {
            entityManager.createQuery("UPDATE MyTableEntity SET status = :newStatus WHERE my_table_id in (?1)",
                    MyTableEntity .class)
                    .setParameter(newStatus, newStatus)
                    .setParameter(1, list);
            statusUpdated = true;
        } catch (IllegalArgumentException | TransactionRequiredException e) {
            throw new Exception(CLASS_NAME,"markStatusById", e);
        }
        return statusUpdated;
    }

Однако по какой-то причине это не работает.

Каков правильный способ достижения того, что предназначено в вышеприведенном запросе. Один из моих ссылок

Теги:
hibernate
sql-update

2 ответа

0
you can use 

entityManager.createQuery("UPDATE MyTableEntity SET status = :newStatus WHERE my_table_id in (?1)",
                    MyTableEntity .class)
                    .setParameter(newStatus, newStatus)
                    .setParameterList(1, list);
            statusUpdated = true;
  • 0
    Это сработало для вас? Я попробовал это, но это не сработало. Также, что такое «список», ссылающийся на .setParameter("list", list) ?
  • 0
    Можете ли вы поделиться структурой класса MyTableEntity?
Показать ещё 2 комментария
0

После определения вашего запроса вам нужно запустить его. Для использования обновления:

int updateCount = entityManager.executeUpdate();

Небольшой совет на стороне, прежде чем вы установите statusUpdated, вы хотите проверить, является ли updateCount > 0.

И еще один совет, основанный на рекомендациях JPA, когда вы хотите запустить DML-запрос (UPDATE/DELETE), рекомендуется запустить эту операцию как отдельную транзакцию. В вашем случае, если вы используете REQUIRES_NEW например, было бы установить уровень распространения этого метода на REQUIRES_NEW:

@Transactional(propagation=Propagation.REQUIRES_NEW)
public boolean markStatusById(List<Integer> list, String newStatus) 

это связано с тем, что эти запросы не ограничивают контекст персистентности, который не обновляется.

  • 0
    Спасибо за ваш ответ и ценные предложения. Тем не менее, я выполнял свой запрос и раньше, просто пропустил его в своем вопросе. Настоящая проблема заключается в настройке списка. Если я выполняю тот же запрос с жестко закодированными идентификаторами, он работает нормально. Единственная проблема - установка параметра IN динамически.
  • 0
    ты пробовал без скобок? также попробуйте с именованным параметром вместо позиционного
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню