Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA查询/Hibernate:列必须出现在GROUP BY子句中或在聚合函数中使用_Java_Hibernate_Jpa - Fatal编程技术网

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排序,但我仍然得到相同的错误。