quarta-feira, 5 de setembro de 2018

JPQL - Parte 3/3

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

Versão 23.3.0-Final

      Introdução Nesse post vou mostrar as principais novidades da versão 23.3.0, algumas correções e pequenas alterações. Alterações Além d...