Упорядочение результатов по вычисленному значению в 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

Что означает, что вы должны делать это на основе вашей базы данных.