Упорядочение результатов по вычисленному значению в Hibernate
У меня есть настольный плеер с идентификатором столбцов, именем, выигрышами, games_played. Я сопоставил его с классным игроком. Я хочу сделать следующий запрос в спящем режиме (желательно с критериями, если это невозможно с критериями, также поможет HQL)
select * from Player order by (wins / games_played)
Я ожидаю, что список будет отсортирован по их коэффициенту выигрыша.
Спасибо за ответ
Пало
2 ответов
Hibernate не поддерживает выражения арифметики в предложении order by. Цитируя раздел 14.12. Предложение group by документации Hibernate:
ни предложение group by, ни предложение order by не могут содержать арифметических выражений.
и действительно, следующий запрос hql не вернет правильно упорядоченные результаты:
select p from Player p order by (p.wins/p.gamesPlayed)
и я не думаю, что вы можете разделить org.hibernate.criterion.Property
поэтому API критериев не будет решать этот.
поэтому я бы предложил использовать вычисляемый атрибут (с формулой), например, с аннотациями:
private float wins;
private float gamesPlayed;
@Formula(value = "WINS/GAMESPLAYED")
private float ratio;
Это позволит выполнить следующий запрос с API критериев:
session.createCriteria(Player.class).addOrder(Order.desc("ratio"))
из документов Hibernate -
SQL-функции и агрегатные функции разрешены в предложениях having и order by, если они поддерживаются базовой базой данных.
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-ordering
Что означает, что вы должны делать это на основе вашей базы данных.