web-dev-qa-db-ja.com

@Queryを使用してhibernateでスプリングデータjpaのブール値を更新する

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データベースも使用しています。

36
aki

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"/>

長い旅でしたが、ようやく機能しました。他の多くの人がすばらしいブログ、回答、コメントで私を助けてくれたので、これが誰かに「前倒しで支払う」助けになることを願っています。

111
TchiYuan

クエリの変更を実行するには、次のように リファレンスドキュメント で概説されているように、追加の@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);
9
Oliver Drotbohm

私にとっても、次のアノテーションで機能しました:

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

私にとっては、次の注釈で機能しました:

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

Spring 5での作業では、@ Transactionalアノテーションが引き続き必要です。

@Repository
public interface DoorStyleRepository extends JpaRepository<DoorStyle, Long> {

    @Modifying
    @Transactional
    @Query("UPDATE DoorStyle ds SET ds.enabled = false")
    void setEnabledFalse();
}
0
Vlad Palnik