java - Hibernate Criteria 连接到包含外键的表

标签 java sql hibernate hibernate-criteria

我有两个表:

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: could not resolve property: eventId of: Client

如何指定 Client 表之间的联接,该表本身不包含与事件表相关的列,但包含 Event 上的 clientId 列> 表是返回 Client 表的外键吗?

正如您所看到的,它确实是由 Client 表驱动的,我只需要从 Event 表中选择最大的 eventId 。另外,正如我提到的,我正在尝试对基于 Client 类的现有 Criteria 查询进行更改。它用于检索所有 Activity 客户端的所有列。我只需向查询结果添加一列 - 最大 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")));

有关标准的更多详细信息,请参阅Criteria Queries

关于java - Hibernate Criteria 连接到包含外键的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893044/

相关文章:

java - Android fragment 和 findFragmentByTag()

sql - 如何使用批处理文件运行多个SQL脚本?

C# 反射 - 根据可用参数选择构造函数重载

java - hibernate 保存时发生 StackOverflowError

windows - java版本问题:(

java - Android Retrofit将信息发布到api数据库

java - hibernate - 无法执行语句; SQL [不适用] - 保存嵌套对象

Java & Mockito - 将参数传递给方法并捕获结果

java - Reactor 3.0.x可以与Spring4.3.x版本一起使用吗?

c# - AddWithValue sql 注入(inject)安全吗?为什么?