[英]Hibernate Criteria join to table containing foreign key
我有兩個表:
Client (clientId, firstName, lastName, gender)
Event (clientId, eventId)
我需要使用Criteria代表類似於以下內容的查詢:
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:無法解析屬性:eventId of:客戶端
我如何指定之間的連接Client
本身不包含任何與事件相關的表,但該列的表clientId
在列Event
表的外鍵返回到Client
的表?
如您所見,它實際上是從Client
表中eventId
,我只需要從Event
表中選擇最大eventId
。 另外,正如我提到的,我試圖對基於Client
類的現有Criteria查詢進行更改。 它用於檢索所有活動客戶端的所有列。 我只需要在查詢結果中增加一列-最大eventId
。
使用別名
Criteria criteria = session.createCriteria(Event.class, "et").
createAlias("et.Client", "ct").
setProjection(Projections.projectionList().
add(Projections.groupProperty("et.clientId")).
add(Projections.max("et.eventId")));
有關條件的更多詳細信息,請參閱條件查詢
那是顯而易見的。 因為Client
類沒有eventId
屬性,並且您的條件是為Client
類定義的。
嘗試在A的Criteria中使用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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.