2017-09-23 54 views
0

我使用Spring 1.5.2引导和以下@Query:春天引导产生无效的MySQL查询(only_full_group_by)

@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中进行任何升级。我如何解决我的查询?

+0

“Spring Boot”不创建该查询,您的JPA提供程序确实(哪一个?)。而且你还没有发布ACTUAL SQL被调用 – DN1

+0

当然,但Spring Boot定义了JPA提供程序 - > Hibernate。对于实际的SQL,我会尝试去获得它(我认为它是使用调试日志记录的),但是我不认为这会有很大的帮助,因为我无法修改实际的SQL,但只能修改JPQL .... – schneida

+0

你定义JPA提供者(对Spring)。然后,实际的SQL被用来报告你选择的JPA提供者的BUG,并说我想在这个数据库上执行这个JPQL并得到这个无效的SQL。 – DN1

回答

0

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

The GROUP BY construct enables the aggregation of result values according to a set of properties.

这意味着如果你正在聚集,它仅用于(总和,平均,最大值,最小值,... )一个或多个字段的值。但在你的情况下,我没有看到任何聚合函数。所以只要去掉GROUP BY条款,一切都应该罚款:

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

上进行分组userId没有意义也因为此查询返回的所有实体将拥有此字段的值相同。

+0

您的解决方案不会更改结果集吗?我认为您的查询会导致我和所有聊天伙伴之间的所有聊天消息都返回。通过组合,我可以使组合具有唯一性,并且每个聊天伙伴只会收到一条聊天消息(而另一个方向)。预计这个小组只会给我不同的结果。 – schneida

+0

“这个小组预计只能给我明确的结果”是错误的假设,与独特的结果无关。您传递的是'userId'的值,并且仅返回此用户的值。正如您在正式规范中所看到的(上面强调的),“group by”仅用于聚合目的,并且您没有使用任何聚合函数。 – ujulu

+0

好吧,你在这方面是正确的,但是对于较老的MySQL版本(并且仍然具有例如最新的MariaDB版本),我的查询完全是我想要的结果。也许,虽然更好的问题是什么是我的用例正确的JPA查询! – schneida