Introdução
No post anterior fizemos alguns exemplos de retorno e uso de FETCH e grafos. Nesse último post faremos mais exemplos dessa API.
Exemplos
Pode ter também um retorno para um bean especifico, observe a seguinte classe abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class LancamentoSumarizado { private long quantidade; private BigDecimal total; public LancamentoSumarizado(long quantidade, BigDecimal total) { this.quantidade = quantidade; this.total = total; } public long getQuantidade() { return quantidade; } public void setQuantidade(long quantidade) { this.quantidade = quantidade; } public BigDecimal getTotal() { return total; } public void setTotal(BigDecimal total) { this.total = total; } } |
Agora vou usar a biblioteca de JPQL do JARCH para retorna uma instância dessa classe:
1 2 3 4 | LancamentoSumarizado lancamentoSumarizado = LancamentoJpaqlBuilder .newInstance() .collect() .aggregate(LancamentoSumarizado.class, count(LancamentoEntity_.id), sum(LancamentoEntity_.valor)); |
Nesse próximo exemplo vou mostrar como retornar uma coleção de um bean (LancamentoPessoa) mostrando a quantidade de contas e o valor total no período de 2018:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Date inicioAno = DateUtils.toDate(LocalDate.of(2018, Month.JANUARY, 1)); Date fimAno = DateUtils.toDate(LocalDate.of(2018, Month.DECEMBER, 31)); Collection<LancamentoPessoa> listaLancamentoPessoa = LancamentoJpaqlBuilder .newInstance() .addGroupBy("pessoa.nomeRazaoSocial") .addAggregate(Aggregate.count(LancamentoEntity_.id)) .addAggregate(Aggregate.sum(LancamentoEntity_.valor)) .where() .greaterOrEqualsThan(LancamentoEntity_.vencimento, inicioAno) .and() .lessOrEqualsThan(LancamentoEntity_.vencimento, fimAno) .collect() .groupBy(LancamentoPessoa.class); listaLancamentoPessoa.forEach(lp -> LogUtils.generate(lp.getNome() + " / " + lp.getQuantidade() + " / " + lp.getValor())); |
Bean LancamentoPessoa utilizado no exemplo anterior:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public class LancamentoPessoa { private String nome; private Long quantidade; private BigDecimal valor; public LancamentoPessoa(String nome, Long quantidade, BigDecimal valor) { this.nome = nome; this.quantidade = quantidade; this.valor = valor; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public Long getQuantidade() { return quantidade; } public void setQuantidade(Long quantidade) { this.quantidade = quantidade; } public BigDecimal getValor() { return valor; } public void setValor(BigDecimal valor) { this.valor = valor; } } |
Existem diversas condições de filtros através da biblioteca, como por exemplo collectionEmpty(), equalsTo(), exists(), greaterOrEqualsThan(), greaterThan(), isNotNull(), isNull(), lessOrEqualsThan(), lessThan(), memberOf(), notCollectionEmpty(), notContains(), notEqualsTo(), notExists(), notMemberOf() e caso algum desses não atenda a sua necessidade existe o jpql() conforme exemplo abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 | Collection<LancamentoEntity> lancamentos = LancamentoJpaqlBuilder .newInstance() .where() .equalsTo(LancamentoEntity_.tipo, LancamentoType.DEBITO) .and() .greaterOrEqualsThan(LancamentoEntity_.vencimento, inicioAno) .and() .lessOrEqualsThan(LancamentoEntity_.vencimento, fimAno) .and() .jpql("EXISTS( FROM pessoa p WHERE p.nome LIKE :nomeParcial)", MapParamValue.of("nomeParcial", "%Wagner%")) .collect() .list(); |
Conclusão
Essa biblioteca facilita o uso do JPQL, trazendo facilidade para buscas de entidades. Essa biblioteca substitui muito bem a API de Criteria da JPA.
Até mais,
Nenhum comentário:
Postar um comentário