我有下表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
使用s.user.id
代替工作正常,但它只给我ID,我需要用户对象。
我现在通过首先获取用户 ID 然后在数据库中查找用户实体来解决此问题,但这需要额外的数据库调用并且对我来说似乎性能不佳,因为我知道它可以在一个查询中完成。
如何解决这个问题呢?
我不允许在应用程序中直接使用 SQL 查询,我必须使用 JPA 查询方法。