簡體   English   中英

在Hibernate命名查詢中基於參數選擇分組

[英]Chose grouping based on parameter in Hibernate named query

我有一個在XML配置中定義的Hibernate命名查詢。

該查詢生成有關人員的人口統計信息的匯總報告。 我們住的地方,那個人可能住在一個省或一個縣。

我想知道是否可以基於休眠查詢參數按省或縣聚合查詢。

這是我嘗試過的:

SELECT to_char(case when :groupReportBy = 'province' then PROVINCE else COUNTY end),
     COUNT(distinct PERSON_TABLE.PERSON_ID) as {personReport.numOfPeople}
     --, There are some other aggregation things that happen here as well
FROM 
  PERSON_TABLE PI
WHERE
  PI.BDATE >= date '2014-01-01' and PI.BDATE <= date '2014-12-31'
GROUP BY 
  case when :groupReportBy = 'province' then PROVINCE else COUNTY end);

參數名稱是:groupReportBy。 如果我用硬編碼“省”而不是參數名稱,則此查詢將起作用,但是如果如上所示運行它,則會出現以下錯誤:

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:

我從Java代碼執行查詢,如下所示:

private List getReport (String namedQuery, String groupReportBy) {

    Session session = sessionFactory.getCurrentSession();
    Query query = session.getNamedQuery(namedQuery);

    query.setParameter("reportBy", reportBy);

    return query.list();
}

我正在使用Oracle數據庫。

我真的希望不必使用Criteria API重新編寫這些查詢。 實際上,它們長久以來都是超級騙子,其中有很多。

有沒有辦法在SQL中做到這一點?

我從未使用組參數對其進行過測試,但是我認為它的行為與JPQL / HQL查詢的其他部分相同。 NamedQueries是預編譯的,因此以后不能更改(參數除外)。

我花了2分鍾的時間研究了JPA規范,但沒有找到確切的定義,可以在運行時進行修改。 因此,以下內容可能不是100%正確的,但對您來說應該足夠了。

JPQL / HQL在運行時無法在NamedQuery中更改關鍵字和模型對象屬性,其原因可能是查詢已轉換為基於對象的表示形式。 因此,您有必要編寫一個標准的JPQL / HQL查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM