我知道我可以在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,但只是想看看这是否是我可以先做的事情。
答案 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
}
}
答案 2 :(得分:0)
或者在纯SQL中:
def rating = new groovy.sql.Sql(datasource).firstRow("select max(Abs(rating)) rating from book where author = ${author.name}")?.rating