Подтвердить что ты не робот

Обновление логического значения в spring данных jpa с использованием @Query, с спящим режимом

У меня настроены и запущены spring -data и hibernate. Я могу сохранить записи с помощью spring -data, но по какой-то причине я не могу запустить запрос, который обновит все логические поля в таблице.

Я пробовал это:

@Query("update Content v set v.published = false where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division, 
                         @Param("section") String section);

Я также пробовал это:

 @Query("update Content v set v.published = 0 where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division, 
                         @Param("section") String section);

Деление и раздел параметров выполняются, но изменений в таблице не происходит.

p.s. Я также использую базу данных mysql.

4b9b3361

Ответ 1

Я использую Spring 3.1 и Spring JPA Data. У меня была аналогичная проблема. Я постоянно получал ошибку при попытке обновить несколько записей в 1 запросе.

Итак, у меня было что-то вроде этого.

@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

Ошибка:

org.hibernate.hql.QueryExecutionRequestException: Not supported for DML operations

Итак, после поиска в Google, я узнал, что вам нужно добавить @Modification.

@Modifying  
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

Но потом я получил следующую ошибку:

...    
nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; 
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
...

Итак, я понял, что проблема теперь была проблемой транзакций, и я вернулся в Google, чтобы исследовать ее и выяснил, что теперь вы должны добавить @Transactional. Похоже, что @Modification также требует @Transactional.

@Modifying  
@Transactional
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

но затем я получил следующую ошибку:

No value for key [org.apache.commons.dbcp.BasicDataSource (...) ] bound to thread

Снова я искал Google и пришел к выводу, что моя конфигурация была неправильной, и это оказалось правдой. Мне не хватало каких-либо конфигураций xml.

<beans:bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <beans:property name="entityManagerFactory" ref="entityManagerFactory"/>
</beans:bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

Это было долгое путешествие, но я, наконец, получил его работу. Я надеюсь, что это поможет кому-то, пытаясь "оплатить его", поскольку многие другие помогли мне с их замечательными блогами, ответами и комментариями.

Ответ 2

Чтобы выполнить модификацию запросов, вам необходимо аннотировать метод дополнительным @Modifying, как описано в справочной документации , например:

@Modifying
@Query("update Content v set v.published = false where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division, 
                     @Param("section") String section);

Ответ 3

Для меня он также работал со следующими аннотациями:

@Modifying
@Query("update User u set u.active=1 where a.id=?1")
@Transactional
void  activeUser(Long id);

Ответ 4

Для меня это работало со следующими аннотациями:

@Modifying
@Query("update JsonContactImport x set x.isImported = true where x.id in :ids")
@Transactional
void updateImported(@Param("ids")  List<Long> ids);