как выразить следующий SQL в HQL - PullRequest
1 голос
/ 07 февраля 2012

Как выразить следующий SQL в HQL.

select *  from (
            select *
            from vw_report_alert r 
            where r.user_id=147  
            order by r.event_creation_date DESC
           ) 
     where rownum <= 25
     order by alert_id DESC

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

ROWNUM - специфичная для поставщика функциональность (в частности, Oracle). SQLServer имеет нечто очень похожее при создании запросов с использованием псевдо-ограничений: запросы должны быть заключены в SELECT ROW_NUMBER() OVER ..., что обычно нельзя делать в Hibernate, не прибегая к необработанному SQL.

Я бы порекомендовал проверить специфичный для поставщика диалект , который вы используете для поддержки этой функции. У них есть один для всех основных поставщиков, в том числе:

  • PostgreSQL
  • MySQL
  • Oracle
  • SQLServer
  • Sybase
  • и т.д.

Также убедитесь, что вы действительно используете правильный диалект в своей конфигурации гибернации.

Судя по источнику, Hibernate поддерживает функцию Oracle ROWNUM, по крайней мере, с Oracle 8.

EDIT: Это должно произвести то, что вы ищете. Я позволил себе преобразовать поля / таблицы БД в имена, соответствующие Java, потому что похоже, что вы используете сырой SQL вместо объектов Java (таблица "vw_report_alert" -> VwReportAlert, столбец "user_id" -> userId, столбец "alert_id" -> id, столбец "event_creation_date" -> eventCreationDate)

getSession().createQuery(
  "select r from VwReportAlert r " +
  "where r.userId = :userId " +
  "order by r.eventCreationDate desc, r.id desc")
.setInteger("userId", 147)
.setMaxResults(25)
.list();
0 голосов
/ 07 февраля 2012

AFAIK, это невозможно сделать напрямую.Но есть простой обходной путь:

String hql = "select r from VwReportAlert r where r.user.id = 147"
             + " order by r.eventCreationDate desc";
List<VwReportAlert> result = session.createQuery(hql).setMaxResults(25).list();
Collections.sort(result, Collections.reverseOrder(new ByAlertIdComparator()));
return result;

Конечно, список отсортирован на Java, но сортировка проста, а размер списка очень мал.

...