【问题标题】:Grails Criteria - multiple functions on same fieldGrails Criteria - 同一字段上的多个函数
【发布时间】:2016-01-08 12:25:40
【问题描述】:

我知道我可以在 Criteria 中使用 mysql 函数,如下所示:

Number rating = Book.createCriteria().get
      eq("author", author)
      projections {
          max rating
      }
}

执行相当于

select max(rating) from book where author = 'authors name';

但是如果这个评分可以是正面的或负面的,并且我想要绝对最大值,是否可以在 Criteria 中执行以下操作:

select max(Abs(rating)) from book where author = 'authors name'

也许我需要恢复为 HQL,但只是想看看这是否是我可以先做的事情。

【问题讨论】:

    标签: mysql grails hql criteria


    【解决方案1】:

    就个人而言,我会将其重写为 HQL

    def result = Book.executeQuery(
        "select max(abs(rating)) from Book where author = :author", [author: author])
    

    您可以通过sqlRestriction 在条件查询的谓词中使用 SQL,但我认为不能在projections 中使用它们。

    【讨论】:

      【解决方案2】:

      我认为最简洁的方法是在 Book 类中添加一个公式:

      class Book {
          Integer rating
          Integer absRating
          ...
      
          static mapping = {
              absRating formula: 'ABS(RATING)'
          }
      }
      

      然后在您的条件中使用absRating

      Number rating = Book.createCriteria().get
            eq("author", author)
            projections {
                max absRating
            }
      }
      

      链接:Derived Properties

      【讨论】:

      • 编辑域对象对我来说可能有点矫枉过正,因为我只需要在整个应用程序中使用它一次,我想如果不可能的话我需要使用 HQL。
      • 没错,这是一个判断电话。就个人而言,我认为我会使用它,因为我更喜欢 createCriteria 语法而不是 HQL,但我知道它最终会生成相同的 SQL,所以这是一种不合理的不喜欢。
      【解决方案3】:

      或者用普通的 SQL:

      def rating = new groovy.sql.Sql(datasource).firstRow("select max(Abs(rating)) rating from book where author = ${author.name}")?.rating
      

      【讨论】:

      • 感谢@defectus,但正如问题中提到的那样,在恢复为 HQL 之前,我希望看看是否有使用 Criteria 的解决方案。
      • 我知道我只是想变得有趣一点。但是如果你只有一把锤子(或Hibernate),那么一切看起来都像钉子(或Criteria):-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 2013-02-20
      • 2013-03-01
      相关资源
      最近更新 更多