【问题标题】:How to make LIMIT work in Grails HQL executeUpdate()?如何使 LIMIT 在 Grails HQL executeUpdate() 中工作?
【发布时间】:2023-03-10 04:28:01
【问题描述】:

我正在运行 grails 1.3.6,我有这个代码:

String hql = '''
    UPDATE
        ApiResponse a
    SET
        a.lockId = :lockId
    WHERE
        a.lockId = 0
    ORDER BY
        a.dateAdded asc
    LIMIT 5
    '''
ApiResponse.executeUpdate(hql, [lockId : workerId])

似乎此代码更新了 DB 中的所有行,而不是 5 个最旧的条目。这是否意味着 LIMIT 在 HQL 中不起作用?请帮助我如何在 GORM 或 HQL 中实现相同的 SQL 逻辑。基本上,我需要使用 LIMIT 进行批量更新。

【问题讨论】:

    标签: grails hql grails-orm


    【解决方案1】:

    我在做什么(grails 1.3.7):

    ExAus.executeQuery( "select distinct <field> from <controller>", [max: 20, offset: 0] )
    

    【讨论】:

      【解决方案2】:

      在等待某人回复时,我想我找到了解决方法。这里是:

      def c = ApiResponse.createCriteria()
      def targetList = c.list {
          eq('lockId', 0)
          maxResults(5)
          order("dateAdded", 'asc')
      }
      
      String hql = '''
          UPDATE
              ApiResponse
          SET
              lockId = :lockId
          WHERE
              id in (:ids)
      '''
      ApiResponse.executeUpdate(hql, [lockId : workerId, ids: targetList.collect {it.id}])
      

      我相信这种方法仍然可以被视为与原始方法相同的逻辑。但是,这必须进行 2 次查询。

      欢迎提出其他方法。谢谢!

      【讨论】:

      • 我相信限制仅适用于选择。我认为您的解决方法是唯一的方法。但是应该有一种方法可以提高效率,因为我认为迭代所有行只是为了组成 id 列表非常慢。在此处查看有关 hql 的更多信息grails.asia/grails-tutorial-for-beginners-hql-queries
      【解决方案3】:

      我知道这个帖子已经很老了,但这个问题仍然相关,因为我遇到了同样的问题。

      我转而使用 Groovy sql (jdbc)。

      您需要先在您的服务/控制器中注入 dataSource 对象,方法是:

      def dataSource
      

      那么你可以在你的方法中这样做:

      String sqlQuery = '''
      UPDATE
          API_RESPONSE a
      SET
          a.LOCK_ID = :lockId
      WHERE
          a.LOCK_ID = 0
      ORDER BY
          a.DATE_ADDED asc
      LIMIT 5
      '''
      def sql = new Sql(dataSource)
      sql.executeUpdate(sqlQuery, [lockId : workerId])
      

      请注意,您需要在 sql 查询中使用数据库本机表和列名。

      【讨论】:

        猜你喜欢
        • 2013-03-09
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多