2017-09-23 32 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