2016-10-04 13 views
0

これは私のHQLの試みorg.springframework.orm.hibernate4.HibernateQueryException:DML操作はサポートされていません[UPDATE]

である私は、データベース内のレコードを更新しようとしていると私は

org.springframework.orm.hibernate4.HibernateQueryException: Not supported for DML operations [UPDATE com.xxx.models.User u set u.notifiable = true WHERE u.emailAccess = :emailAccess AND u.isAdmin = false]; nested exception is org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [UPDATE com.xxx.models.User u set u.notifiable = true WHERE u.emailAccess = :emailAccess AND u.isAdmin = false] 

このエラーを取得

@Modifying 
    public User updateUser(String emailAccess) { 

     String hql = "UPDATE User u set u.notifiable = true WHERE u.emailAccess = :emailAccess AND u.isAdmin = false"; 
     return (User) _sessionFactory.getCurrentSession().createQuery(hql).setParameter("emailAccess", emailAccess).list(); 

    } 

リサーチした後、@ Modificationアノテーションをメソッドの先頭に追加しましたが、エラーは引き続き発生します。何が間違っている可能性がありますか?

+0

返信欄に** list()**が表示され、1人のユーザーしか返されません。それが正しいか? – duardito

+0

'list'の代わりに 'executeUpdate()'を使用してください 同じ問題が発生しました: http://stackoverflow.com/questions/17622147/not-supported-for-dml-operations-with-simple-update-query – seiya

答えて

0

@Modifyingは、春のデータアノテーションであり、あなたは役に立たないので、春のデータを使用しているようには見えません。エンティティ更新または削除の数..

https://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Query.html#executeUpdate()

かの結果を返す:あなたは

戻りexecuteUpdate()を呼び出し、executeUpdateの

として復帰方法ボイドを作成する必要があり

2番目のクエリ。

public void updateUser(String emailAccess) { 

    String hql = "UPDATE User u set u.notifiable = true WHERE u.emailAccess = :emailAccess AND u.isAdmin = false"; 
    _sessionFactory.getCurrentSession().createQuery(hql).setParameter("emailAccess", emailAccess).executeUpdate(); 

} 
+0

Can not cast intからUserへあなたの解決策に関しては、 – Francis

+0

APIドキュメントの状態としてexecuteUpdate()は、ユーザーではなくintで更新または削除されたエンティティの数を返します。 –

+0

正確に何が欠けていますか? –

0

エンティティを更新または削除するときは、クエリでexecuteUpdate()を呼び出す必要があります。

list()あなたが使用している方法は、指定されたクエリでエンティティを選択し、それらを更新しないことです。

メソッドのシグネチャと戻り値の型が正しくありません。 update操作で実際に特定のユーザーのみが更新されることは決して確認できません。 executeUpdate()メソッドは、更新されたエンティティではなく、クエリの影響を受ける行の数を返します。

さらに、元の回答のlist()でも特定のユーザーは返されません。選択されたクエリの場合は、条件に応じてユーザーのリストが返されます。

関連する問題