2017-09-23 9 views
0

나는 봄 부팅 1.5.2 사용하고 유효하지 않은 MySQL의 쿼리 (ONLY_FULL_GROUP_BY) 다음과 같은 @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 데이터베이스 버전)에서이 오류가 얻을 : 그러나 나는 방법을 찾을 수 없습니다, 나는이 변화의 이유가 무엇인지이 thread 읽을

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 

을 이것을 JPA/Spring으로 해결할 수 있습니다. 프로덕션 MySQL 데이터베이스의 설정을 변경할 수 없으며 Spring에서 업그레이드하지 않으려합니다. 내 검색어를 어떻게 수정합니까?

+0

"Spring Boot"가 해당 쿼리를 작성하지 않았 으면 JPA 제공자가 (어느 것을 사용합니까?). 그리고 당신은 – DN1

+0

인 ACTUAL SQL을 게시하지 않았습니다. 그러나 Spring Boot는 JPA 공급자 -> Hibernate를 정의합니다. 실제 SQL의 경우 디버깅 로깅과 함께 기록 될 것입니다. 그러나 실제로 SQL을 수정할 수는 없으므로 도움이 될 것 같지 않습니다. – schneida

+0

Spring에 JPA 제공자를 정의하십시오. 그리고 나서 실제 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