Java JPA查询/Hibernate:列必须出现在GROUP BY子句中或在聚合函数中使用
我有下表Java JPA查询/Hibernate:列必须出现在GROUP BY子句中或在聚合函数中使用,java,hibernate,jpa,Java,Hibernate,Jpa,我有下表会话: sessionid | user_id | begin (timestamp) ----------+---------+------------------- 1 | A | 1234 2 | B | 4567 3 | A | 8912 4 | C | 3456 该表提供了有关用户会话的信息。基本上,会话是指用户成功登录 现在,我想获得最近登录的用户列表。如
会话
:
sessionid | user_id | begin (timestamp)
----------+---------+-------------------
1 | A | 1234
2 | B | 4567
3 | A | 8912
4 | C | 3456
该表提供了有关用户会话的信息。基本上,会话是指用户成功登录
现在,我想获得最近登录的用户列表。如果一个用户有多个登录(并且在这个表中出现两次或更多次),我将使用最新的时间戳。列表应按logintime排序,以便最新的用户位于列表的顶部
我使用以下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
我在这里选择用户而不是用户id,因为用户是会话中的实体。我们也在使用Hibernate,在执行此查询时,出现以下错误:
ERROR[org.hibernate.util.jdbceptionreporter]错误:列“user1\uu1.id”必须出现在GROUP BY子句中,或在聚合函数中使用
相反,使用s.user.id
可以很好地工作,但它只提供id,我需要用户对象
我现在做了一个变通方法,首先获取用户ID,然后在数据库中查找用户实体,但这需要额外的数据库调用,而且对我来说似乎不太好,因为我知道这可以在一个查询中完成
如何解决这个问题
我不允许在应用程序中直接使用SQL查询,我必须使用JPA查询方法进行查询。不是在计算机上,因此我无法尝试查看它是否有效,但是如果您没有使用group by,而是选择了distinct s.user ORDER by s.begin怎么办?(可能需要使用连接语法)您的意思是像一样,通过MAX(s.begin)DESC从会话的顺序中选择不同的s.user
?如果这样做,我会得到这个错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中。省去MAX(),只需按s.begin排序,并让distinct子句组合多个相同的用户。虽然读取错误,但它实际上可能不起作用…@Charlie我现在省去了MAX(),而只是按s.begin排序,但我仍然得到相同的错误。