如何在HQL中表達以下SQL。如何在HQL中表達下列SQL
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
感謝
如何在HQL中表達以下SQL。如何在HQL中表達下列SQL
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
感謝
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中,但排序很容易,並且列表大小非常小。
ROWNUM
是供應商特定的功能(特別是Oracle)。在使用僞限制創建查詢時,SQLServer有一些非常相似的事情:查詢必須包裝在SELECT ROW_NUMBER() OVER ...
中,這通常不是在Hibernate中通常不會使用原始SQL的情況下執行的。
我想推薦的是檢查您用於支持此功能的vendor-specific dialect。他們有一個所有主要廠商,包括:
另外,還要確保你」重新在您的休眠配置中使用正確的方言。
從細讀源,它似乎具有休眠支持Oracle的ROWNUM
功能,因爲至少甲骨文8
編輯: 這將產生你在找什麼。我冒昧地將DB字段/錶轉換爲與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();
感謝馬特,我使用的是Oracle和正確的方言,在其他情況下我沒有與rownum有關的問題,我只是不習慣子查詢。 – user1193290 2012-02-07 02:17:45
Matt,如果您更仔細地閱讀原始SQL,您將會看到首先獲取用戶按創建日期排序的所有報告,然後從該排序的集合中獲取25條記錄,並按警報ID對這25條記錄進行排序。在你的情況下,它會採用雙重排序,然後得到25條記錄,這不幸的不是客戶想要的。 – user1193290 2012-02-14 14:33:01
排序日期,修剪爲25,然後排序ID假定自然排序順序將得到尊重。我不假設任何這樣的事情,這就是爲什麼我在排序中指定ID。如果在日期中有1000條記錄匹配,則無法保證您將獲得1000條記錄中的25條記錄。我的「日期,ID」強制執行可重複的結果。 – 2012-02-14 14:52:05
感謝JB,對我來說,我會做在DB排序,我的客戶有特定的排序要求。我現在開始思考,可能有可能在子句中移動子查詢,而可能會使用Criteria API。 – user1193290 2012-02-07 02:12:45
在標準中可以完成的所有事情也可以使用HQL完成。反過來是不正確的。所以你會比使用HQL更受Criteria的限制。但我不明白爲什麼這些特定的排序要求不能滿足Java。 – 2012-02-07 08:07:44
當然,他們可能是,只是我想繼續排序在一個地方的具體情況。現在,由於我沒有太多時間,所以我創建了2個查詢,這些查詢都很簡單。如果任何機構想要,我可以在這裏發佈。謝謝 – user1193290 2012-02-08 12:39:29