删除 Grails 服务中的记录
Delete records in Grails service
在 Grails 服务 中,我必须从 Db 中删除记录,但出现以下错误:
spi.SqlExceptionHelper, Connection is read-only. Queries leading to data modification are not allowed.
虽然在我的服务中有@Transactional(readOnly = false)
,但这里是我的服务代码中的删除部分:
def adsDurationIs7 = null
adsDurationIs7 = Ads.findAllByDuration("7 days", [sort: "dateCreated", order: "asc"])
adsDurationIs7.each {
Ads.get(it.id).delete(flush: true)
}
您正在从控制器的函数执行此服务函数,该函数不是事务性的。添加 @Transactional 到控制器的功能。
这是一个例子:
我不确定为什么这行不通,但即使行得通,您也在尽可能地花钱做这项工作。您将所有实例加载到内存中(包括所有 non-lazy 属性和集合),然后为每个实例获取其 id
并使用它通过 get
调用再次加载实例(虽然如果你幸运的话 and/or 你已经正确配置了缓存,这个 可能 是一个 no-op),然后使用它一次删除每个数据库记录.你在数据库中订购,这会增加处理时间,但完全没有必要,因为你要删除查询 returns.
的所有内容
您真正想要的是最终 运行 SQL 类似于
的 GORM 代码
delete from ads where duration=?
其中 PreparedStatement 将 ?
参数值设置为 "7 days"
。
这个 "where" 查询将完全做到这一点:
Ads.where { duration == '7 days' }.deleteAll()
此 HQL 更新也将如此:
Ads.executeUpdate 'delete Ads a where a.duration = :duration',
[duration: '7 days']
所以你的服务应该是这样的
import grails.transaction.Transactional
@Transactional
class MyService {
void deleteAdsDurationIs7() {
Ads.where { duration == '7 days' }.deleteAll()
}
}
或
import grails.transaction.Transactional
@Transactional
class MyService {
void deleteAdsDurationIs7() {
Ads.executeUpdate 'delete Ads a where a.duration = :duration',
[duration: '7 days']
}
}
在 Grails 服务 中,我必须从 Db 中删除记录,但出现以下错误:
spi.SqlExceptionHelper, Connection is read-only. Queries leading to data modification are not allowed.
虽然在我的服务中有@Transactional(readOnly = false)
,但这里是我的服务代码中的删除部分:
def adsDurationIs7 = null
adsDurationIs7 = Ads.findAllByDuration("7 days", [sort: "dateCreated", order: "asc"])
adsDurationIs7.each {
Ads.get(it.id).delete(flush: true)
}
您正在从控制器的函数执行此服务函数,该函数不是事务性的。添加 @Transactional 到控制器的功能。
这是一个例子:
我不确定为什么这行不通,但即使行得通,您也在尽可能地花钱做这项工作。您将所有实例加载到内存中(包括所有 non-lazy 属性和集合),然后为每个实例获取其 id
并使用它通过 get
调用再次加载实例(虽然如果你幸运的话 and/or 你已经正确配置了缓存,这个 可能 是一个 no-op),然后使用它一次删除每个数据库记录.你在数据库中订购,这会增加处理时间,但完全没有必要,因为你要删除查询 returns.
您真正想要的是最终 运行 SQL 类似于
的 GORM 代码delete from ads where duration=?
其中 PreparedStatement 将 ?
参数值设置为 "7 days"
。
这个 "where" 查询将完全做到这一点:
Ads.where { duration == '7 days' }.deleteAll()
此 HQL 更新也将如此:
Ads.executeUpdate 'delete Ads a where a.duration = :duration',
[duration: '7 days']
所以你的服务应该是这样的
import grails.transaction.Transactional
@Transactional
class MyService {
void deleteAdsDurationIs7() {
Ads.where { duration == '7 days' }.deleteAll()
}
}
或
import grails.transaction.Transactional
@Transactional
class MyService {
void deleteAdsDurationIs7() {
Ads.executeUpdate 'delete Ads a where a.duration = :duration',
[duration: '7 days']
}
}