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);
パラメーターの分割とセクションが実現されましたが、テーブルに変更はありません。
追伸mysqlデータベースも使用しています。
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
それで、しばらくグーグルで調べた後、@ Modifyingを追加する必要があることがわかりました。
@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
...
だから、私の問題は今やトランザクションの問題だと思ったので、グーグルに戻って調査し、今すぐ@Transactionalを追加する必要があることを知りました。 @Modifyingには@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
再びグーグルでしばらくの間、私の設定が間違っていて、それが真実であることが判明したという結論に達しました。いくつかの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"/>
長い旅でしたが、ようやく機能しました。他の多くの人がすばらしいブログ、回答、コメントで私を助けてくれたので、これが誰かに「前倒しで支払う」助けになることを願っています。
クエリの変更を実行するには、次のように リファレンスドキュメント で概説されているように、追加の@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);
私にとっても、次のアノテーションで機能しました:
@Modifying
@Query("update User u set u.active=1 where a.id=?1")
@Transactional
void activeUser(Long id);
私にとっては、次の注釈で機能しました:
@Modifying
@Query("update JsonContactImport x set x.isImported = true where x.id in :ids")
@Transactional
void updateImported(@Param("ids") List<Long> ids);
Spring 5での作業では、@ Transactionalアノテーションが引き続き必要です。
@Repository
public interface DoorStyleRepository extends JpaRepository<DoorStyle, Long> {
@Modifying
@Transactional
@Query("UPDATE DoorStyle ds SET ds.enabled = false")
void setEnabledFalse();
}