3

我有下表session

sessionid | user_id | begin (timestamp)
----------+---------+-------------------
     1    |    A    |  1234
     2    |    B    |  4567
     3    |    A    |  8912
     4    |    C    |  3456

该表提供有关用户会话的信息。基本上,会话是用户成功登录的时候。

现在,我想获取最近登录的用户列表。如果用户有多个登录(并且在此表中出现两次或更多),我使用最近的时间戳。该列表应按登录时间排序,以便最近的用户位于列表顶部。

使用以下 SQL 查询我解决了这个问题:

SELECT s.user_id, MAX(begin) -- MAX(begin) can be left out, results are the same
FROM session s
GROUP BY s.user_id
ORDER BY MAX(s.begin) DESC

但是,在我的应用程序中,我应该为此使用 JPA 查询。所以我将其转换为以下 JPA 查询:

SELECT s.user
FROM Session s
GROUP BY s.user
ORDER BY MAX(s.begin) DESC

我在这里选择用户而不是 user_id,因为用户是会话中的实体。我们也在使用 Hibernate,在执行此查询时,我收到以下错误:

ERROR [org.hibernate.util.JDBCExceptionReporter] ERROR: column "user1_.id" must appear in the GROUP BY clause or be used in an aggregate function

我在 Hibernate 上找到了有关此行为的错误描述。

使用s.user.id代替工作正常,但它只给我ID,我需要用户对象。

我现在通过首先获取用户 ID 然后在数据库中查找用户实体来解决此问题,但这需要额外的数据库调用并且对我来说似乎性能不佳,因为我知道它可以在一个查询中完成。

如何解决这个问题呢?

我不允许在应用程序中直接使用 SQL 查询,我必须使用 JPA 查询方法。

4

0 回答 0