Сегодня я столкнулся с той же проблемой, но ни одно из предложенных решений не помогло мне, потому что мне нужно было повторно использовать выражение не только в предложении order by
, но и в предложении group by
.Одним из очевидных решений было бы создание представления на уровне базы данных, но это немного неуклюже, создает ненужный подзапрос и даже невозможно, если пользователю db не предоставлено достаточно привилегий.Лучший вариант, который я реализовал, это написать что-то вроде
q.select(cb.tuple(
gpe.<String>get("gameId"),
cb.count(gpe),
...
)).groupBy(cb.literal(2)).orderBy(cb.literal(2));
. Первым недостатком этого подхода является то, что код подвержен ошибкам.Другим недостатком является то, что сгенерированный SQL-запрос содержит порядковый номер позиции, который работает в некоторых базах данных (например, postgresql или mariadb), но не работает в других (например, SQL-сервер).В моем случае, однако, я нашел, что это лучший вариант.
Протестировано на jpa 2.1 с hibernate 5.2.3 в качестве провайдера и postgresql 9.6.