2016-10-04 75 views
0

我試圖更新數據庫中的記錄,我得到這個錯誤org.springframework.orm.hibernate4.HibernateQueryException:不支持DML操作[更新]

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] 

這是我的HQL嘗試

@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(); 

    } 

經過研究,我在方法的頂部添加了@Modifying註釋,但錯誤仍然存​​在。請問有什麼可能是錯的?

+0

在你的return語句中我看到** .list()**並且你只返回一個用戶。這是對的嗎? – duardito

+0

使用'executeUpdate()'而不是'list' 同一問題在這裏: http://stackoverflow.com/questions/17622147/not-supported-for-dml-operations-with-simple-update-query – seiya

回答

0

@Modifying是一個Spring數據註釋,你似乎沒有使用Spring數據,因此對你來說沒用。

你需要調用executeUpdate(),使返回方法無效作爲executeUpdate的

返回:更新或刪除實體

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

數..或者返回的結果第二個查詢。

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

無法投射從int到User。關於您的解決方案 – Francis

+0

由於API文檔狀態executeUpdate()返回更新或刪除的實體的數量,因此是int而不是用戶。 –

+0

究竟是什麼遺漏? –

0

當您要更新或刪除實體時,您應該在查詢中調用executeUpdate()

list()您正在使用的方法是通過給定的查詢選擇實體,而不是更新它們。

您的方法簽名和返回類型不正確。你永遠不能確定update操作實際上只會更新一個特定的用戶。 executeUpdate()方法返回受查詢影響的行數,而不是更新的實體。

而且,即使您的原始答案中的list()也不會返回特定用戶。它(在選擇查詢的情況下)將根據您的條件返回用戶列表。