Query dinâmica utilizando @Query - Spring Boot

boa tarde. preciso de uma query, em que as colunas que quero podem variar.

Repository:

    @Query(nativeQuery = true, value = "SELECT SUM(:mes) AS total FROM tb_pessoal_socios_dependentes_pensao_valor v "
						    		 + "INNER JOIN tb_pessoal_socios_dependentes_pensao_ano a ON a.socio_id IN (:socioId) "
						    		 + "WHERE a.ano = (:ano)")
    Double findTotalPeriodo(Long socioId, String mes, String ano);

Service:

final Double total = pagamentoSocioRepository.findTotalPeriodo(entity.getSocio().getId(), "jan", "2023");
System.out.print(total);

No caso, onde está “jan” e “2023”, pode mudar…
as colunas com valor são: jan, fev, …

Para testar, pensei em algo desta forma porém não deu mt certo. Algm poderia me ajudar?

O problema da sua abordagem é que, provavelmente, a consulta está sendo montada com aspas no sum, ficando assim: SUM('jan').

Acredito que, nesse caso, seja melhor vc usar um repositório customizado. Para isso, vc precisa ter uma interface e criar a implementação e, com isso, fazer a query usando uma string na mão. E executar a consulta usando uma entityManager.

Por exemplo:

public interface PagamentoSocioRepository implements PagamentoSocioRepositoryCustom {
  // métodos
}
public interface PagamentoSocioRepositoryCustom {
  Double findTotalPeriodo(Long socioId, String mes, String ano);
}
@Component
public class PagamentoSocioRepositoryCustomImpl implements PagamentoSocioRepositoryCustom {
  public Double findTotalPeriodo(Long socioId, String mes, String ano) {
    // crie a consulta de forma dinâmica e execute com entityManager
  }
}

DOCS: Spring Data JPA - Reference Documentation

obrigado pela resposta.

mas no caso, meu repository tem que usar extends JpaRepository, pois faço a persistência dos dados utilizando JPA;

e tbm fiquei um pouco confuso no que exatamente fazer aqui.

public interface PagamentoSocioRepository implements PagamentoSocioRepositoryCustom {
  // métodos
}

Ah sim, na real, pode deixar o extends JpaRepository mesmo (eu que esqueci de colocar no exemplo).