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