2013-03-06 44 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])