1

我有两张桌子:

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表中选择最大值。此外,正如我所提到的,我正在尝试对基于Client该类的现有 Criteria 查询进行更改。它用于检索所有活动客户端的所有列。我只需要在查询结果中添加一列 - 最大值eventId

4

2 回答 2

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")));

有关标准的更多详细信息,请参阅标准查询

于 2013-04-09T04:13:24.547 回答
0

这是显而易见的。因为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));

我不确定你在寻找什么,但我希望我给了你一些好的提示。Subqueries.propertyEq如果您的查询必须返回单个 id,您可能想尝试一下。

于 2013-04-09T04:16:38.643 回答