簡體   English   中英

Hibernate Criteria連接到包含外鍵的表

[英]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.

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