Я использую Grails Criteria (аналогично критериям гибернации), чтобы получить список учеников, получивших высшую оценку в каждом подразделении из данной таблицы. И я хочу ТОЛЬКО Name
, Division
и Grade
полей.Можно ли использовать агрегатные функции и свойства в проекциях, критериях, Grails?
Name | Division | Grade | Std_id
---------------------------------
AA1 | A | 2 | 1
AA2 | A | 4 | 2
BB1 | B | 2 | 3
BB2 | B | 5 | 4
В результате я хочу
Name | Division | Grade |
--------------------------
AA2 | A | 4 |
BB2 | B | 5 |
, если я использую следующие критерии
def criteria = Student.createCriteria()
def resultlt = criteria.list {
projections {
groupProperty('divison')
max('grade')
}
}
я получил ТОЛЬКО Division
и Grade
, другие поля не включены. Мне также нужно поле Name
.
Если я изменил критерии (используются агрегатные функции и свойства вместе в прогнозах) для
def criteria = Student.createCriteria()
def resultlt = criteria.list {
projections {
property('name')
groupProperty('divison')
max('grade')
}
}
Это дает следующее сообщение об ошибке ..
ERROR: column "this_.name" must appear in the GROUP BY clause or be
used in an aggregate function
Position: 63. Stacktrace follows:
org.postgresql.util.PSQLException: ERROR: column "this_.name" must
appear in the GROUP BY clause or be used in an aggregate function
Position: 63
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryEx
ecutorImpl.java:2161)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutor
Impl.java:1890)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.ja
va:255)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Stat
ement.java:559)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(Abstract
Jdbc2Statement.java:417)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc
2Statement.java:302)
Это решение будет работать только тогда, когда столбец вы хотите выбрать имеет 'String' type.It не будет работать, если столбец имеет' числовой (междунар, длинный, флоат) 'типа. –
Почему? если функция агрегата может быть применена, она будет работать с любым типом – injecteer
. Я только что проверил ее, и он дает неправильные значения. Вы также можете проверить его. –