Упорядочивание результатов по вычисленному значению в Hibernate - PullRequest
7 голосов
/ 03 марта 2010

У меня есть таблица Player с колонками id, name, wins, games_played. Я сопоставил его с классом Player. Я хочу выполнить следующий запрос в Hibernate (желательно с Criteria, если не возможно с Criteria, HQL также поможет)

выберите * из порядка игрока по (выигрывает / games_played)

Я ожидаю, что список будет отсортирован по коэффициенту выигрыша.

Спасибо за ответ

Palo

Ответы [ 2 ]

11 голосов
/ 03 марта 2010

Hibernate не поддерживает арифметические выражения в предложении order by. Цитирование раздела 14.12. Группировка по пункту документации Hibernate:

Ни предложение group by, ни order by не могут содержать арифметических выражений.

И действительно, следующий hql-запрос не вернет правильно упорядоченные результаты:

select p from Player p order by (p.wins/p.gamesPlayed) 

И я не думаю, что вы можете разделить org.hibernate.criterion.Property, чтобы Criteria API не решил эту проблему.

Поэтому я бы предложил использовать вычисляемый атрибут (с формулой), например, с аннотациями:

private float wins;
private float gamesPlayed;
@Formula(value = "WINS/GAMESPLAYED")
private float ratio;

Это позволило бы следующий запрос с Criteria API:

session.createCriteria(Player.class).addOrder(Order.desc("ratio"))
2 голосов
/ 03 марта 2010

Из документов гибернации -

Функции SQL и агрегатные функции разрешены в предложениях using и order by, если они поддерживаются базовой базой данных.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-ordering

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

...