Я новичок в 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;
}
Однако по какой-то причине это не работает.
Каков правильный способ достижения того, что предназначено в вышеприведенном запросе. Один из моих ссылок
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;
После определения вашего запроса вам нужно запустить его. Для использования обновления:
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)
это связано с тем, что эти запросы не ограничивают контекст персистентности, который не обновляется.
.setParameter("list", list)
?