【问题标题】:create a query delete in gorm在gorm中创建查询删除
【发布时间】:2019-05-13 12:51:58
【问题描述】:

早上好,我需要在 Grails Hibernate (Gorm) 中执行 SQL 服务器的以下查询。 我不明白如何执行顶部的查询

("delete CORE_NOTIFICATIONS where id in (select top 1000 ID form CORE_EVENT where date <10)")

在gorm中我是这样做的,但它给出了错误

query = "delete CoreNotifications CN where CN.event_id in (select top? ID from CoreEvent CE where CE.date <?)"
res = CoreNotifications.executeUpdate (query, params)

我的错误是什么?

【问题讨论】:

  • 异常中的错误是:意外令牌:顶部意外令牌:ID

标签: grails grails-orm


【解决方案1】:

根据我的经验,您很可能使用 GORM 来删除感兴趣的记录。下面是我以前对我的项目所做的代码的 sn-p。正如您在下面的评论中提到的,建议使用并行性,因为该表包含三百万条记录。

Date specifiedDate = Date.parse("yyyy-MM-dd hh:mm:ss", "2010-04-03 1:23:45") // pass your date here by extrating from params
def result = CoreEvent.where { date < specifiedDate }
List<Integer> iDs = result.list(sort: "date").collect { it.id }

GparsPool.withPool {

   iDs.eachParallel {
      // we need to wrap inside a single transaction for parallelism
      CoreNotifications.withTransaction {
         CoreNotifications.where { id == it }.deleteAll()
      }
   }
}

我希望这段代码可以帮助您按预期解决问题。

【讨论】:

  • 我是否需要将该任务委托给数据库引擎,因为该查询可以带来 3000000 条记录
  • 在这种情况下,我认为您的需求可能与如何执行繁重的工作而不是与 GORM 交互更相关。在 Groovy 中,我们可以受益于 [GPars Framework] (gpars.org/1.0.0/guide/guide/index.html),它为并行作业提供了高级工具。
  • @wagego:查看我通过添加并行性更改的更新代码
  • 但是您不是在 CoreEvent 上进行内存加载吗?这就是为什么我需要数据库引擎来完成这个过程。还是我听不懂?
  • @wagego:如果您因为内存问题而怀疑在CoreEvent 表中获取正确记录的过程,您可以批量处理。在将数千条记录的元数据导出到 XML 文件时,我们正在应用批处理模式。第二和第三条语句旨在获取涉及 CoreNotifications 的核心事件列表。如果这些表有数百万条记录,更好的方法是分页并应用批处理。
猜你喜欢
  • 2019-03-21
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多