6
respostas

Consulta Spring Data com Group By

Consultas simples pelo Spring já me deram dor de cabeça algumas vezes, mas superei e agora eu tenho um novo problemão, preciso utilizar uma Exibição de um Banco SqlServer, e ainda preciso também utilizar o Group By para trazer informações precisas para um relatório, isso é feito para otimizar a resposta para o usuário. A seguinte consulta:

SELECT Descricao,
        Expr1, 
        SUM(ValorApurado) as ValorApurado, 
        Count(Descricao) as Quantidade, 
        SUM(QuantidadeEixo) as QuantidadeEixo
FROM
VE_RelResumoArrecadacaoIsentoDiversos
GRoup by Descricao,
         Expr1

Pelo que eu sei do Spring preciso criar uma entidade para receber esses dados, mas o problema está no momento em que o Spring me diz que não tem um id para a tabela ai eu me perco.

Abaixo uma Classe do Spring com uma Query Básica:

public interface RepoVE_RelRecarga extends JpaRepository<VE_RelRecarga, Integer> {

    @Query(value = "select * from VE_RelRecarga where IdConta = ?1 AND DataOperacao > ?2 AND DataOperacao < ?3", nativeQuery = true)
    ArrayList<VE_RelRecarga> findAllRecargas(int idConta, Timestamp dataInicio, Timestamp dataFinal);

}

Essa query acima busca dados a partir de uma data, esses dados tem um ID então são normalmente implantados em um ArrayList, agora quando fizermos uma query com um Group By no final não dados com ID que retornaram: Exemplo na imagem em anexo abaixo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Preciso saber como procedo no Spring Data para Implantar esses dados em uma Classe no java.

6 respostas

Oi Fábio,

O Sring Data é apenas uma abstração em cima da JPA, para deixá-la mais simples ainda.

A recomendação então é que você faça os cursos de JPA, para entender melhor sobre como funciona o mapeamento de tabelas em entidades JPA e também sobre queries utilizando a sintaxe do JPQL:

Bons estudos!

Já estou fazendo hehe...

Olá novamente, verifiquei o conteúdo dos cursos e nenhum irá tirar as minhas dúvidas. Pois bem, o meu problema é mapear dados sem chave primária, isso eu não encontrei em nenhum dos cursos. Pode analisar meu problema novamente?

Oi Fábio,

Acredito que não tenha como, pois a JPA exige que toda entidade tenha uma chave primária e o atributo correspondete a ela seja anotado com @Id.

Deve ter alguma "solução alternativa" para esses casos, o que não é o ideal, pois pode causar outros problemas.

Na documentação da JPA tem esse trecho mencionando esse cenário:

Sometimes your object or table has no primary key. The best solution in this case is normally to add a generated id to the object and table. If you do not have this option, sometimes there is a column or set of columns in the table that make up a unique value. You can use this unique set of columns as your id in JPA. The JPA Id does not always have to match the database table primary key constraint, nor is a primary key or a unique constraint required.

If your table truly has no unique columns, then use all of the columns as the id. Typically when this occurs the data is read-only, so even if the table allows duplicate rows with the same values, the objects will be the same anyway, so it does not matter that JPA thinks they are the same object. The issue with allowing updates and deletes is that there is no way to uniquely identify the object's row, so all of the matching rows will be updated or deleted.

If your object does not have an id, but its' table does, this is fine. Make the object an Embeddable object, embeddable objects do not have ids. You will need a Entity that contains this Embeddable to persist and query it.

Uau, muito obrigado, vou tentar essa opção e dou meu feedback valew.

Funcionou, esqueci de avisar aqui.