JPA2 с Criteria API, похоже, генерирует недопустимый SQL для PostgreSQL. Для этого кода:
Root<DBObjectAccessCounter> from = query.from(DBObjectAccessCounter.class);
Path<DBObject> object = from.get(DBObjectAccessCounter_.object);
Expression<Long> sum = builder.sumAsLong(from.get(DBObjectAccessCounter_.count));
query.multiselect(object, sum).groupBy(object);
Я получаю следующее исключение:
ERROR: column "dbobject1_.id" must appear in the GROUP BY
clause or be used in an aggregate function
Сгенерированный SQL:
select dbobjectac0_.object_id as col_0_0_,
sum(dbobjectac0_.count) as col_1_0_, dbobject1_.id as id1001_,
dbobject1_.name as name1013_,
dbobject1_.lastChanged as lastChan2_1013_,
dbobject1_.type_id as type3_1013_
from DBObjectAccessCounter dbobjectac0_
inner join DBObject dbobject1_
on dbobjectac0_.object_id=dbobject1_.id
group by dbobjectac0_.object_id
Очевидно, что первый элемент оператора select (dbobjectac0_.object_id) не соответствует предложению group by.
Упрощенный пример
Это даже не работает для этого простого примера:
Root<DBObjectAccessCounter> from = query.from(DBObjectAccessCounter.class);
Path<DBObject> object = from.get(DBObjectAccessCounter_.object);
query.select(object).groupBy(object);
который возвращает
select dbobject1_.id as id924_, dbobject1_.name as name933_,
dbobject1_.lastChanged as lastChan2_933_,
dbobject1_.type_id as type3_933_
from DBObjectAccessCounter dbobjectac0_
inner join DBObject dbobject1_
on dbobjectac0_.object_id=dbobject1_.id
group by dbobjectac0_.object_id
и выдает ту же ошибку, что и выше.
Группировка по идентификатору вместо типа
Группировка по идентификатору в соответствии с сообщением об ошибке с
Root<DBObjectAccessCounter> from = query.from(DBObjectAccessCounter.class);
Path<DBObject> object = from.get(DBObjectAccessCounter_.object);
Path<Long> objectId = from.get(DBObjectAccessCounter_.object).get(DBObject_.id);
query.select(object).groupBy(objectId);
также приводит к той же ошибке.
Кто-нибудь знает, как это исправить?
object.id
в предложенииgroupBy
? Означает лиgroupBy(object)
неявно группу по первичному ключу в JPA? Или группировать по всем полям? Можете ли вы показать ошибку, вызванную упрощенным примером? - person Craig Ringer   schedule 14.09.2012