2013-03-06 35 views
1

我想在一個域類中運行一個刪除所有的類屬性值(Member.submissionId和submission.id作爲長類型)。Grails deleteAll()失敗,休眠異常

這裏是我的代碼:

def memberCount = Member.where{ eq("submissionId", submission.id) }.deleteAll() 

這裏是例外,我得到:

nested exception is org.hibernate.hql.ast.QuerySyntaxException: unexpected token: member near line 1, column 57 [DELETE my.domain.Member member WHERE (member.submissionId=?)] 

其他刪除我有,我引用的提交對象似乎工作確定:

def subErrorCount = SubmissionError.where{ eq("submission", submission) }.deleteAll() 

對於此刪除,生成的SQL是正確的:

delete from submission_error where submission_id=? 

我可以看到的唯一區別是SubmissionError屬於父提交對象,其中Member有一個通過其submissionId屬性(它屬於另一個對象)的提交的軟鏈接。

有什麼建議嗎?

編輯:另外,我是否正確假設此刪除方法不是級聯刪除由於它生成的SQL?即屬於選定成員的對象不會被刪除。

回答

1

看起來'member'是HQL中的保留字。如果沒有太大的麻煩,我會建議更改域名模型名稱。

+0

這是一個相當大的風險/麻煩,我認爲。我還可以運行此刪除查詢還有哪些其他方法?理想情況下,也可以使用級聯刪除。 – shuttsy 2013-03-06 12:26:06

+0

不太漂亮,但它會工作:Member.where {eq(「submissionId」,submission.id)} .each {it.delete()} – Dopele 2013-03-06 13:17:43

1

您可以通過編寫查詢作爲HQL查詢自己避免產生嚴重的HQL:

Member.executeUpdate("delete Member m where m.submissionId = :subId", [subId: submission.id])