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

时间:2016-01-08 12:25:40

标签: mysql grails hql criteria

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

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

执行等效的

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

但是,如果此评级可以是正数或负数,并且我想要绝对最大值,是否可以在条件中执行以下内容:

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

我认为最干净的方法是在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

答案 2 :(得分:0)

或者在纯SQL中:

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