2012-02-06 46 views
1

如何在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 

感謝

回答

0

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中,但排序很容易,並且列表大小非常小。

+0

感謝JB,對我來說,我會做在DB排序,我的客戶有特定的排序要求。我現在開始思考,可能有可能在子句中移動子查詢,而可能會使用Criteria API。 – user1193290 2012-02-07 02:12:45

+0

在標準中可以完成的所有事情也可以使用HQL完成。反過來是不正確的。所以你會比使用HQL更受Criteria的限制。但我不明白爲什麼這些特定的排序要求不能滿足Java。 – 2012-02-07 08:07:44

+1

當然,他們可能是,只是我想繼續排序在一個地方的具體情況。現在,由於我沒有太多時間,所以我創建了2個查詢,這些查詢都很簡單。如果任何機構想要,我可以在這裏發佈。謝謝 – user1193290 2012-02-08 12:39:29

0

ROWNUM是供應商特定的功能(特別是Oracle)。在使用僞限制創建查詢時,SQLServer有一些非常相似的事情:查詢必須包裝在SELECT ROW_NUMBER() OVER ...中,這通常不是在Hibernate中通常不會使用原始SQL的情況下執行的。

我想推薦的是檢查您用於支持此功能的vendor-specific dialect。他們有一個所有主要廠商,包括:

  • PostgreSQL的
  • MySQL的
  • 甲骨文
  • SQLServer的
  • 的Sybase

另外,還要確保你」重新在您的休眠配置中使用正確的方言。

從細讀源,它似乎具有休眠支持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(); 
+0

感謝馬特,我使用的是Oracle和正確的方言,在其他情況下我沒有與rownum有關的問題,我只是不習慣子查詢。 – user1193290 2012-02-07 02:17:45

+0

Matt,如果您更仔細地閱讀原始SQL,您將會看到首先獲取用戶按創建日期排序的所有報告,然後從該排序的集合中獲取25條記錄,並按警報ID對這25條記錄進行排序。在你的情況下,它會採用雙重排序,然後得到25條記錄,這不幸的不是客戶想要的。 – user1193290 2012-02-14 14:33:01

+0

排序日期,修剪爲25,然後排序ID假定自然排序順序將得到尊重。我不假設任何這樣的事情,這就是爲什麼我在排序中指定ID。如果在日期中有1000條記錄匹配,則無法保證您將獲得1000條記錄中的25條記錄。我的「日期,ID」強制執行可重複的結果。 – 2012-02-14 14:52:05