У меня есть таблица Player с идентификатором столбцов, именем, победами, games_played. Я отобразил его на класс Плеер. Я хочу выполнить, следующий запрос В спящем режиме (предпочтительно с Критериями, если не возможный с Критериями HQL также поможет),
выберите * из порядка Плеера (победы / games_played)
Я ожидаю получать Список <Плеер>, отсортированный по их отношению победы.
Спасибо за ответ
Palo
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
, так что 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"))
Из документации Hibernate -
SQL-функции и агрегатные функции разрешены в предложениях having и order by, если они поддерживаются базой данных.
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-ordering
Что означает, что вам нужно делать это на основе вашей базовой базы данных.