web-dev-qa-db-ja.com

単純なUPDATEクエリを使用した「DML操作はサポートされていません」

エラーが発生していますNot supported for DML operations次のHQLを使用する場合...

@Query("UPDATE WorkstationEntity w SET w.lastActivity = :timestamp WHERE w.uuid = :uuid")
void updateLastActivity(@Param("uuid") String uuid, @Param("timestamp") Timestamp timestamp);

問題の原因は何ですか? Googleで見つけたいくつかの結果を考えると、これは一般的なエラーではないようです。

33
Webnet

Hibernate usersフォーラムの投稿 hibernate hql ERROR:Not supported for DML operations を確認してください。

おそらくあなたは電話した

querySt.list();

UPDATEクエリ用。代わりに呼び出す必要があります

querySt.executeUpdate();
38
Ajay Bhojak

私もアノテーションで同じ問題を抱えていました。検索していくつかのトリックを実行した後、私はそれを解決することができました。 JPAでDML操作を使用しているときに確認する必要がある手順がいくつかあります。

  1. 必要なメソッドでアノテーション@Modifying(org.springframework.data.jpa.repository.Modifying)および@Transactional(org.springframework.transaction.annotation.Transactional)を使用します。

  2. メソッドの戻り値の型としてvoidを使用します。

例えば:-

@Modifying

@Query( "UPDATE ProcedureDTO o SET o.isSelectedByUser =?1")

@Transactional

public void getListOfProcedureBasedOnSelection(Boolean isSelected);

1
Saurabh

updateLastActivityを呼び出すサービスクラスメソッドに@Transactional(org.springframework.transaction.annotation.Transactional)アノテーションがあることを確認してください。リポジトリのメソッドを以下に変更します。

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
...
@Modifying
@Query("UPDATE WorkstationEntity w SET w.lastActivity = :timestamp WHERE w.uuid = :uuid")
void updateLastActivity(@Param("uuid") String uuid, @Param("timestamp") Timestamp timestamp);

詳細については、 この回答 を使用してください。

0
tk_

同じことが起こったのは、クラスQueryのオブジェクトqであるため、q.list()は更新または削除に使用されるのではなく、q.executeUpdate()

0
Weslor