2016-01-08 4 views
0

Я знаю, что могу использовать функцию MySQL в критериях следующим образом:Grails Критерии - множество функций на одном поле

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, но просто хотелось посмотреть, было ли это что-то, что я мог сделать в первую очередь.

ответ

2

Лично я бы переписать его как HQL

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

Вы можете использовать SQL в предикатами запроса критериев с помощью sqlRestriction, но я не думаю, что их можно использовать в projections.

0

Или простой SQL:

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

Спасибо @defectus, но, как уже упоминалось в вопросе, он посмотрел, было ли решение с использованием критериев, прежде чем возвращаться к HQL. – dre

+1

Я знаю, что я просто старался быть немного забавным. Но если все, что у вас есть, это молот (или «Hibernate»), все выглядит как гвоздь (или «Criteria») :-) – defectus

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

+0

Вероятно, немного переборщить, чтобы отредактировать объект домена, поскольку мне нужно использовать его только один раз в все приложение, я думаю, мне нужно использовать HQL, если это невозможно. – dre

+0

Правда, это вызов. Лично я думаю, что я буду использовать его, потому что я предпочитаю синтаксис 'createCriteria' над HQL, но я знаю, что он заканчивается тем же сгенерированным SQL, что и иррациональная неприязнь. – tylerwal

Смежные вопросы