quarta-feira, 5 de setembro de 2018

JPQL - Parte 2/3

Introdução

No post anterior fizemos alguns exemplos de filtros usando a JPQL do JARCH. Nesse post faremos mais exemplos dessa API.

Exemplos

Para carregar relacionamentos lazy é só especificar no retorno da biblioteca, conforme exemplo abaixo:
1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
        Date inicioAno = DateUtils.toDate(LocalDate.of(2018, Month.JANUARY, 1));
        Date fimAno = DateUtils.toDate(LocalDate.of(2018, Month.DECEMBER, 31));

        Collection<LancamentoEntity> lancamentos = LancamentoJpaqlBuilder
                .newInstance()
                .fetchJoin(LancamentoEntity_.centroCusto)
                .fetchLeftJoin(LancamentoEntity_.listaLancamentoPagamento)
                .where()
                    .equalsTo(LancamentoEntity_.tipo, LancamentoType.DEBITO)
                    .and()
                    .greaterOrEqualsThan(LancamentoEntity_.vencimento, inicioAno)
                    .and()
                    .lessOrEqualsThan(LancamentoEntity_.vencimento, fimAno)
                .collect()
                .list()

O exemplo anterior vai carregar todos os lançamento do tipo débito no período de 2018,  e o atributo centroCusto e listaLancamentoPagamento serão preenchidos para cada lançamento, utilizando o Join Fetch da JPA.
Podemos usar também o grafo da JPA, para esse mesmo exemplo anterior agora usando grafo no lugar do Join Fetch:
1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Date inicioAno = DateUtils.toDate(LocalDate.of(2018, Month.JANUARY, 1));
        Date fimAno = DateUtils.toDate(LocalDate.of(2018, Month.DECEMBER, 31));

        Collection<LancamentoEntity> lancamentos = LancamentoJpaqlBuilder
                .newInstance()
                .entityGraph("entityGraphPagamento")                .where()
                    .equalsTo(LancamentoEntity_.tipo, LancamentoType.DEBITO)
                    .and()
                    .greaterOrEqualsThan(LancamentoEntity_.vencimento, inicioAno)
                    .and()
                    .lessOrEqualsThan(LancamentoEntity_.vencimento, fimAno)
                .collect()
                .list();

No código abaixo observe na linha 1 a definição do grafo no LancamentoEntity usado no comando anterior:
1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@NamedEntityGraph(name = "entityGraphPagamento", attributeNodes = @NamedAttributeNode("listaLancamentoPagamento"))
@Audited
@Table(name = "tb_lancamento",
        indexes = {
                @Index(columnList = "cd_lancamento, ds_lancamento", name = "dx_lancamentocomp1"),
                @Index(columnList = "dt_vencimento", name = "dx_lancamentovencimento"),
                @Index(columnList = "vl_valor", name = "dx_lancamentovalor")})
@Entity(name = "lancamento")
@Where(clause = Constant.WHERE_LOGIC_EXCLUSION)
public class LancamentoEntity extends CrudMultiTenantEntity {

    @SequenceGenerator(name = "LancamentoIdSequence", sequenceName = "sq_idlancamento", allocationSize = 1)
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "LancamentoIdSequence")
    @Column(name = "id_lancamento")
    private Long id;

    @Column(name = "cd_lancamento")
    private String codigo;

Existe alguns outros tipos de retorno, já mostrei o list() que retorna uma Collection, o single() que retorna uma instância e o singleOptional() que retorna um Optional. Agora vou mostrar mais 2 tipos, a quantidade (Long) e se existe lançamento (Boolean).
Segue um exemplo abaixo desses retornos:
1
2
3
4
5
6
7
8
9
Long quantidade = LancamentoJpaqlBuilder
                .newInstance()
                .collect()
                .count();

        Boolean existe = LancamentoJpaqlBuilder
                .newInstance()
                .collect()
                .exists();

Vou mostrar agora alguns retornos de agregação, média, quantidade, mínimo, máximo, soma:
1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Object[] resultado = LancamentoJpaqlBuilder
                .newInstance()
                .collect()
                .aggregate(Aggregate.avg(LancamentoEntity_.valor), Aggregate.count(LancamentoEntity_.codigo), Aggregate.countDistinct(LancamentoEntity_.descricao));

        LogUtils.generate("Média Valor: " + resultado[0] + " Quantidade Código: " + resultado[1] + " Quantidade Descrição Diferente: " + resultado[2]);


        resultado = LancamentoJpaqlBuilder
                .newInstance()
                .collect()
                .aggregate(Aggregate.max(LancamentoEntity_.valor), Aggregate.min(LancamentoEntity_.valor), Aggregate.sum(LancamentoEntity_.valor));

        LogUtils.generate("Maior Valor: " + resultado[0] + " Menor Valor: " + resultado[1] + " Soma Valores: " + resultado[2]);

Conclusão

Nesse post vimos mais alguns exemplos de usos da JPQL do JARCH. No próximo e último post dessa série veremos mais alguns exemplos.

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...