Grails Criteria - 同一领域的多个功能

Grails Criteria - multiple functions on same field

我知道我可以在 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,但只是想看看我是否可以先做这件事。

或者简单地说 SQL:

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

我认为最简洁的方法是在 Book class:

中添加一个公式
class Book {
    Integer rating
    Integer absRating
    ...

    static mapping = {
        absRating formula: 'ABS(RATING)'
    }
}

然后在您的标准内使用 absRating

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

Link: Derived Properties

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

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

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