Spring Boot生成无效的MySQL查询(only_full_group_by)

时间:2017-09-23 18:03:31

标签: java mysql spring hibernate jpql

我正在使用Spring Boot 1.5.2和以下@Query:

@Query(value = "SELECT m FROM Message m WHERE m.from.userId = :myId OR m.to.userId = :myId GROUP BY m.from.userId, m.to.userId ORDER BY m.date DESC")
List<Message> chatOverview(@Param("myId") final Long myUserId);

查询的目的是创建聊天信使概述,您可以在其中查看每个对话的最后一条消息。它在dev中工作正常,但在生产(较新的MySQL数据库版本)中我收到此错误:

java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'message0_.message_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

我在这篇thread中读到了这个改变的原因是什么,但是我找不到用JPA / Spring解决这个问题的方法。我无法更改生产MySQL数据库中的任何设置,我也想避免在Spring中进行任何升级。如何修复查询?

1 个答案:

答案 0 :(得分:0)

以下是GROUP BY(参见第4.7节)条款的定义和目的:

  

GROUP BY构造允许根据一组属性聚合结果值。

这意味着它仅在您聚合(sum,avg,max,min,...)字段的值时使用。但在你的情况下,我没有看到任何聚合功能。所以只需删除GROUP BY子句,一切都应该没问题:

SELECT m FROM Message m WHERE m.from.userId = :myId OR m.to.userId = :myId ORDER BY m.date DESC

userId进行分组也没有意义,因为此查询返回的所有实体对此字段都具有相同的值。