2011-08-05 36 views
1

我嘗試將我的SQL查詢轉換爲HQL或JPQL(我希望受益於對象映射)。HQL/JPQL - 從嵌套選擇FROM

我的SQL請求是:

SELECT * 
FROM (SELECT bde, MAX(creation_date) 
     FROM push_campaign GROUP BY bde) temp, 
push_campaign pc where pc.bde = temp.bde and pc.creation_date = temp.creation_date; 

我嘗試(失敗)將其與轉換在JPQL:

select pc 
from (select bde, max(creationDate) 
     from PushCampaign group by bde) temp, 
PushCampaign pc 
where pc.bde = temp.bde and pc.creationDate = temp.creationDate 

但我得到了提出:

IllegalArgumentException occured : 

組織.hibernate.hql.ast.QuerySyntaxException:意外標記:(近 1行,第16欄第

I [(由BDE從 models.PushCampaign組中選擇的id,MAX(creationDate))溫度,models.PushCampaign PC其中 pc.id = temp.id選擇從PC]讀取嵌套select只能在select或where子句中。

您是否有解決方法來保持對象映射的請求和好處?

+0

您是否嘗試過使用'INNER JOIN',而不是在'WHERE'加盟條款? –

+0

我有搜索如何但我找不到子查詢和innerjoin的任何示例。我嘗試過的所有測試都失敗了......感謝提示,我會繼續向這個方向發展 – iwalktheline

+0

在jpql的內部連接中不可能有子查詢。這是唯一可能的地方或有陳述.... – iwalktheline

回答

1

與JPQL或HQL不可能在單個請求中。

要在單個請求爲此,我提出這樣的:

String campaignToLaunch = "select pc.* from PushCampaign pc ..." 
//SQL request which return a resultset compatible with the models.PushCampaign class 
Class className = Class.forName("models.PushCampaign"); 
List<PushCampaign> result = JPA.em() 
          .createNativeQuery(campaignToLaunch,className) 
          .getResultList(); 
1

這應該achive類似的結果

select pc 
from PushCampaign pc 
where pc.creationDate = 
(select max(creationDate) from PushCampaign inner where inner.bde = pc.bde) 
+0

事實上,我需要爲每個人口「bde」單個記錄。您的請求不允許。而且,實際上不同/一個人口可以有相同的創建日期。 – iwalktheline

+0

@kheraud您的答案可能更有效,但我的查詢*確實會爲每個bde返回一條記錄。對於每條記錄,子查詢將僅查找當前bde的最大日期,以便每個記錄的子查詢結果不同,並且它應返回正確的結果。嘗試一下。 – Firo

2

一個簡單的解決辦法是:

servlet 
{ 
    Query q = entityManager.createNativeQuery("SQL"); 
    List<> li = q.getResultList(); 

    @PersistenceContext(unitName="UNIT") 
    private EntityManager entityManager; 
}