Eu preciso montar uma consulta Criteria que me retorne o TOTAL das despesas com situação igual a ABERTO, agrupadas por CARTÕES CORPORATIVOS.
Gostaria de saber se consigo fazer esse tipo de consulta utilizando Specifications com Spring Data ?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Eu preciso montar uma consulta Criteria que me retorne o TOTAL das despesas com situação igual a ABERTO, agrupadas por CARTÕES CORPORATIVOS.
Gostaria de saber se consigo fazer esse tipo de consulta utilizando Specifications com Spring Data ?
A select seria algo semelhante ao que esta abaixo:
SELECT
SUM(D.VALOR),
F.NOME
FROM DESPESA D
INNER JOIN FUNCIONARIO F
ON F.ID = D.ID_FUNCIONARIO
WHERE D.SITUACAO = 'A'
GROUP BY F.NOMEComo montar isso com Spring Data utilizando JpaRepository e JpaSpecificationExecutor ???
Converti a ideia em uma JPQL e obtive o resultado esperado, mas vou continuar com problemas para aplicar os filtros
@Data
public class DespesaDto {
String idtel;
String nome;
String bandeira;
String cartao;
Date dataIinicio;
Date dataFim;
BigDecimal valorTotal;
} @Query(value =
" select "
+ " new br.com.nuvemapi.integrador.dtos.DespesaDto("
+ " d.idtelUsuario,"
+ " f.nome,"
+ " d.movimento.funcionarioCartao.bandeira,"
+ " d.movimento.funcionarioCartao.cartao,"
+ " min(d.data), "
+ " max(d.data), "
+ " sum(d.valor) "
+" )"
+ " from DespesaEntity d "
+ " join FuncionarioPortalEntity f on f.idtel = d.idtelUsuario"
+ " where d.situacaoDespesa.idSituacao = 2"
+ " group by "
+ " d.idtelUsuario,"
+ " f.nome,"
+ " d.movimento.funcionarioCartao.bandeira,"
+ " d.movimento.funcionarioCartao.cartao")
List<DespesaDto> totalDespesasPorUsuario();Alguém tem alguma solução de como deixar isso dinâmico ???
Preciso filtrar por Período (dataInicial, DataFinal) e por Funcionário (idtel) inicialmente, e ambos os campos são de preenchimento opcional.
Oi Thiano, tudo bem?
Sim, é possível criar essa consulta usando specifications usando Spring data.
A query que você está montando ficaria algo assim:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Despesa> query = builder.createQuery(Despesa.class);
Root<Despesa> despesaRoot = query.from(Despesa.class);
List<Predicate> predicateList = new ArrayList<>();
Join<Despesa, Funcionario> join = despesaRoot.join("funcionario", JoinType.INNER);
predicateList.add(builder.and(builder.equal(join.get())), builder.sum(despesaRoot.get("valor")));
query.groupBy(join.get("nome"));
query.where( predicateList.toArray( new Predicate[predicateList.size()] ) );
query.select(despesaRoot);
TypedQuery<Despesa> createQuery = em.createQuery(query);
return (List<Despesa>) createQuery.getResultList();Espero ter ajudado,
Abraço!