3
respostas

Erro no GROUP BY

JDBC exception executing SQL [select s1_0.id,s1_0.atores,s1_0.avaliacao,s1_0.genero,s1_0.poster,s1_0.sinopse,s1_0.titulo,s1_0.total_temporadas from serie s1_0 join episodio e1_0 on s1_0.id=e1_0.serie_id group by s1_0.id,s1_0.titulo,s1_0.genero,s1_0.atores,s1_0.avaliacao order by e1_0.data_lancamento desc fetch first 10 rows only] [ERROR: column "s1_0.poster" must appear in the GROUP BY clause or be used in an aggregate function Posição: 55] [n/a]; SQL [n/a]

ele não entendeu que o alias era pra toda a classe aparentemente. Aparentemente estou com problema no Group By e no MAX();, tirei os 2. Porém no curso estão utilizando.... E o group by vai ser importante.

https://github.com/luis13005/screenmatch-spring/blob/master/screenmatch/src/main/java/br/com/alura/screenmatch/repository/SerieRepository.java

3 respostas

Olá, Luís. Tudo bem?

O erro que você está vendo indica que a coluna s1_0.poster precisa estar no GROUP BY ou ser usada em uma função de agregação, como MAX(), SUM(), etc.

Quando você utiliza GROUP BY, todas as colunas que não estão em uma função de agregação precisam ser incluídas na cláusula GROUP BY. Isso porque o SQL precisa saber como agrupar as linhas para essas colunas específicas.

No seu caso, a consulta está tentando selecionar várias colunas da tabela serie, mas nem todas estão no GROUP BY. Para corrigir isso, você pode adicionar s1_0.poster e as outras colunas que não estão em funções de agregação na cláusula GROUP BY, ou, se for apropriado, usar uma função de agregação para essas colunas.

Aqui está um exemplo de como você poderia ajustar sua consulta:

SELECT s1_0.id, s1_0.atores, s1_0.avaliacao, s1_0.genero, s1_0.poster, s1_0.sinopse, s1_0.titulo, s1_0.total_temporadas
FROM serie s1_0
JOIN episodio e1_0 ON s1_0.id = e1_0.serie_id
GROUP BY s1_0.id, s1_0.titulo, s1_0.genero, s1_0.atores, s1_0.avaliacao, s1_0.poster, s1_0.sinopse, s1_0.total_temporadas
ORDER BY MAX(e1_0.data_lancamento) DESC
FETCH FIRST 10 ROWS ONLY;

Note que adicionei todas as colunas da seleção ao GROUP BY. Isso deve resolver o erro que você está enfrentando. No entanto, tenha em mente que adicionar muitas colunas ao GROUP BY pode não ser a solução ideal se você estiver tentando agregar dados de alguma forma específica.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Eu já tinha arrumado o order by anteriormente, porém da o erro:

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Mon Mar 24 12:32:52 AMT 2025 There was an unexpected error (type=Internal Server Error, status=500). No message available java.lang.UnsupportedOperationException

e no intellij: java.lang.UnsupportedOperationException: null

OBS: na aula a professora utiliza o alias para fazer um group by "geral" acredito. Porque o meu não funciona? Eu consegui corrigir com o native SQL, porém gostaria de entender a causa dos 2 erros, Não funcionar igual ao da aula e ao corrigir o group by dar o erro apontado acima.

Detalhe: Tenho somente uma série cadastrada, com vários episódios

Olá, Luís!

Sobre sua última dúvida, o erro java.lang.UnsupportedOperationException pode estar acontecendo porque o Spring Data JPA não suporta algumas operações específicas quando utilizamos JPQL/HQL com GROUP BY diretamente.

Se na aula a professora usou um alias para o GROUP BY "geral", provavelmente está usando uma projeção ou DTO para mapear os resultados. No seu caso, parece que a consulta não está sendo interpretada corretamente pelo Spring Data JPA.

Para resolver isso, você pode testar duas abordagens:

  1. Usar uma consulta nativa no repositório:Se o native query já resolveu, você pode usá-lo diretamente no @Query, garantindo compatibilidade com o banco.

@Query(value = "SELECT s.id, s.titulo, s.genero, s.atores, s.avaliacao, s.poster, s.sinopse, s.total_temporadas 
                FROM serie s
                JOIN episodio e ON s.id = e.serie_id 
                GROUP BY s.id, s.titulo, s.genero, s.atores, s.avaliacao, s.poster, s.sinopse, s.total_temporadas
                ORDER BY MAX(e.data_lancamento) DESC 
                FETCH FIRST 10 ROWS ONLY", 
       nativeQuery = true)
List<Object[]> buscarSeriesComEpisodios();
  1. Criar um DTO para projeção personalizada:Se quiser manter o JPQL, pode criar um DTO específico para capturar os resultados corretamente:

public record SerieDTO(Long id, String titulo, String genero, String atores, Double avaliacao, String poster, String sinopse, Integer totalTemporadas) {}

@Query("SELECT new br.com.alura.screenmatch.dto.SerieDTO(s.id, s.titulo, s.genero, s.atores, s.avaliacao, s.poster, s.sinopse, s.totalTemporadas) 
        FROM Serie s 
        JOIN s.episodios e 
        GROUP BY s.id, s.titulo, s.genero, s.atores, s.avaliacao, s.poster, s.sinopse, s.totalTemporadas
        ORDER BY MAX(e.dataLancamento) DESC")
List<SerieDTO> buscarSeriesComEpisodios();

Isso evita o erro UnsupportedOperationException, já que o Spring JPA não precisa interpretar os resultados de forma inconsistente.

Se ainda não funcionar, verifique se sua entidade Serie tem a relação corretamente mapeada com @OneToMany e se episodios está declarado como uma Collection (List<Episodio>).

Fico à disposição. Abraços e bons estudos!