Spring JPA中JPQL用SELECT DISTINCT加ORDER BY查询报错解决
问题产生原因
报错的核心原因是JPQL语句存在逻辑冲突,生成的SQL不符合语法规范:
- 语句通过
SELECT DISTINCT o.idWhom返回去重后的接收方用户,结果粒度为单个接收方用户 - 但排序规则写的是
ORDER BY o.date DESC,直接依赖消息表的date字段排序。同一个接收方用户会对应多条不同发送时间的消息,数据库无法确定该用哪条消息的时间为去重后的用户排序,在严格SQL模式下会直接抛出语法错误,无法提取结果集。
修复方案
业务需求实际是要按「当前用户和对应接收方的最新消息时间」倒序排列,需要对时间字段做聚合计算,取每个接收方对应的最新消息时间作为排序依据,用GROUP BY实现去重语义更清晰,修改后的查询代码如下:
@Query(value = "SELECT o.idWhom FROM Message o WHERE o.idWho = ?1 GROUP BY o.idWhom ORDER BY MAX(o.date) DESC") List<Users> allCorrespondents(Users user);
修改后逻辑完全匹配需求:先过滤出指定用户发送的所有消息,按接收方分组去重,再取每个分组下最新的消息时间倒序排列,返回的就是按最近联系优先级排序的去重接收方列表,不会再触发SQL语法错误。
内容的提问来源于stack exchange,提问作者Numpek2k
相关产品推荐
相关产品推荐

