【问题标题】:Spring Boot generates invalid MySQL query (only_full_group_by)Spring Boot 生成无效的 MySQL 查询(only_full_group_by)
【发布时间】:2018-03-05 02:17:14
【问题描述】:

我正在使用 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);

查询的目的是创建一个聊天信使概览,您可以在其中看到每个对话的最后一条消息。它在开发中对我来说很好,但在生产中(较新的 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 中进行任何升级。如何修复我的查询?

【问题讨论】:

  • "Spring Boot" 不会创建该查询,您的 JPA 提供程序会创建(哪个?)。而且您还没有发布正在调用的 ACTUAL SQL
  • 当然,但是 Spring Boot 定义了 JPA 提供程序 -> Hibernate。对于实际的 SQL,我将尝试获取它(我认为它是使用调试日志记录的),但我认为它不会有太大帮助,因为我无法修改实际的 SQL,而只能修改 JPQL ....
  • 你定义了 JPA 提供者(给 Spring)。然后使用实际的 SQL 报告您选择的 JPA 提供程序的一个 BUG,说我想在这个数据库上执行这个 JPQL 并得到这个无效的 SQL。
  • 是的,禁用它也记录在上面的链接线程中 - 但是正如我所说,我无法修改生产中的设置。

标签: java mysql spring hibernate jpql


【解决方案1】:

这里是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 上分组也没有意义,因为此查询返回的所有实体都将具有相同的字段值。

【讨论】:

  • 您的解决方案不会改变结果集吗?我认为您的查询将导致返回我和我所有聊天伙伴之间的所有聊天消息。使用 group by,我使组合独一无二,每个聊天伙伴只会收到一条聊天消息(以及另一个方向的一条消息)。 group by 预计只会给我不同的结果。
  • “Group by 预计只会给我不同的结果”是错误的假设,与不同的结果无关。您正在传递 userId 的值,并且只会返回此用户的值。正如您在官方规范(上面突出显示)中看到的那样,group by 仅用于聚合目的,您没有使用任何聚合函数。
  • 好吧,在这方面你是对的,但是对于旧的 MySQL 版本(并且仍然使用最新的 MariaDB 版本),我的查询完全符合我的要求。也许更好的问题是我的用例的正确 JPA 查询是什么!
  • @schneida 如果查询如您所愿,您无需说服我。我只是告诉你,在这个查询中,无论你是否使用group by 子句都没有任何区别(不管你的数据库服务器是否在抱怨它)。如果您想以不同的方式重新提出您的问题,请创建另一个问题并删除该问题。
猜你喜欢
  • 2018-06-18
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2021-08-13
  • 2017-06-19
  • 2017-07-15
相关资源
最近更新 更多