繁体   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