2013-04-09 57 views
1

我有兩個表:休眠條件加入到表中包含外鍵

Client (clientId, firstName, lastName, gender) 

Event (clientId, eventId) 

我要代表類似於以下使用條件的查詢:

SELECT c.clientId, c.firstName, c.lastName, c.gender, MAX(eventId) 
FROM Client c JOIN Event e ON c.clientId = e.clientId 
GROUP BY c.clientId, c.firstName, c.lastName, c.gender 

我已經試過這樣:

final Criteria criteria = session.createCriteria(Client.class); 
criteria.setFetchMode("Event", FetchMode.JOIN); 
criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("clientId")).add(Projections.max("eventId"))); 

但它在帶消息的最後一行上引發異常:

HibernateQueryException:無法解析屬性:的事件ID: 客戶

我怎麼可以指定它本身包含的Event沒有相關的事件表列,但clientIdClient表之間的連接表是一個外鍵返回到Client表嗎?

正如你所看到的,它真的趕走了Client表,我只需要從Event表中選擇最大eventId。另外,正如我所提到的,我正在嘗試對基於Client類的現有Criteria查詢進行更改。它用於檢索所有活動客戶端的所有列。我只需要在查詢結果中添加一個額外的列 - 最大值爲eventId

回答

2

使用別名

Criteria criteria = session.createCriteria(Event.class, "et"). 
createAlias("et.Client", "ct"). 
setProjection(Projections.projectionList().   
add(Projections.groupProperty("et.clientId")). 
add(Projections.max("et.eventId"))); 

有關條件的詳細信息,請參閱Criteria Queries

+0

不完全正確。 「客戶」類可能不知道「事件」類。 – 2013-04-09 04:15:06

+0

雅正確的感謝。更改了答案 – 2013-04-09 04:26:44

0

這是顯而易見的。因爲Client類沒有eventId屬性,並且您的標準被定義爲Client類。

當試圖在A標準內使用B類的屬性時,必須使用別名。

所有你需要做的是修改代碼:

final Criteria criteria = session.createCriteria(Event.class, "event"); 
criteria.createAlias("event.client", "client"); 
criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("clientId")).add(Projections.max("eventId"))); 


修訂(根據您的評論)

當你的查詢需要Event類,你必須這個班有一個Criteria。所以你必須這樣:

final Criteria criteria = session.createCriteria(Event.class, "event"); 
criteria.createAlias("event.client", "client"); 
//The criteria below, is returning clientId 
DetachedCriteria eventCr = DetachedCriteria.forClass(Event.class, "event"); 
eventCr.setProjection(Projections.projectionList().add(Projections.groupProperty("clientId")).add(Projections.max("eventId"))); 
//Now using subqueries you can achieve your goal 
criteria.add(Subqueries.propertyIn("clientId", eventCr)); 

我不知道你在找什麼,但我希望我給你一些好的提示。如果您的查詢必須返回一個ID,您可能需要嘗試使用Subqueries.propertyEq

+0

感謝您的回覆。 問題是,我正在修改基於客戶機類配置的實際基於條件的查詢,並實際選擇了一些其他客戶機列/字段。現在我只需要添加一下,爲每個客戶端從Event表中檢索最大eventId。 有沒有辦法做到這一點與標準仍然基於客戶端類,但加入到事件表中的連接? – 2013-04-09 10:29:27

+0

當然,你可以不用'JOIN'。我建議使用「子查詢」。我已經更新了我的答案,以顯示如何使用「子查詢」。希望對你有幫助。 – 2013-04-09 11:02:18

+0

感謝馬丁,但不幸的是我仍然沒有得到它:-( – 2013-04-09 20:03:46