Introdução
A especificação JPA existe para facilitar o mapeamento de objeto com o banco de dados relacional. Apesar da especifição conter a JPQL e a Criteria, ambas precisam de uma curva de aprendizado grande, sendo que a Criteria acaba sendo muito verboso para uma simples busca de dados. A biblioteca de JPQL do JARCH resolve esse problema. Essa biblioteca é muito poderosa sendo possível fazer buscas de JPQL de forma fluente. Nessa primeira parte do post vamos fazer alguns exemplos de busca de dados com filtros.
Exemplos
Nesse primeiro exemplo vou fazer uma simples busca de todos os lançamentos que contenha na descrição a palavra Aluguel.
Segue o exemplo abaixo:
Collection<LancamentoEntity> listaAluguel = LancamentoJpaqlBuilderAgora vou fazer uma busca do lançamento com o código 000564:
.newInstance()
.where()
.contains("descricao", "Aluguel")
.collect()
.list();
LancamentoEntity lancamento = LancamentoJpaqlBuilderNos dois exemplos anteriores utilizamos o nome do atributo como uma String, o problema disso é que se estivesse digitado errado o nome do atributo ocorreria um erro somente em tempo de execução. Para evitar esse problema, vamos usar o atributo tipado, conforme o exemplo abaixo:
.newInstance()
.where()
.equalsTo("codigo", "000564")
.collect()
.single();
LancamentoEntity lancamento = LancamentoJpaqlBuilderPode ser que não exista o código 000564, então vou usar uma programação defensiva para não tomar uma exceção caso o código não exista. Vou também adicionar um import estático para LancamentoEntity_.codigo, segue o exemplo abaixo:
.newInstance()
.where()
.equalsTo(LancamentoEntity_.codigo, "000564")
.collect()
.single();
Optional<LancamentoEntity> lancamento = LancamentoJpaqlBuilderVou fazer agora uma busca um pouco mais elaborada, vou pesquisar os lançamentos de 2016 e 2018 e que o valor seja maior ou igual que R$ 1.000,00 (Hum Mil).
.newInstance()
.where()
.equalsTo(LancamentoEntity_.codigo, "000564")
.collect()
.singleOptional();
if (lancamento.isPresent()) {
// Executa a logica...
}
Segue o exemplo abaixo:
Date dataInicio2016 = DateUtils.toDate(LocalDate.of(2016, Month.JANUARY, 1));Agora vou selecionar todos os lançamentos que não houve nenhum pagamento:
Date dataFim2016 = DateUtils.toDate(LocalDate.of(2016, Month.DECEMBER, 31));
Date dataInicio2018 = DateUtils.toDate(LocalDate.of(2018, Month.JANUARY, 1));
Date dataFim2018 = DateUtils.toDate(LocalDate.of(2018, Month.DECEMBER, 31));
Collection<LancamentoEntity> lancamento = LancamentoJpaqlBuilder
.newInstance()
.where()
.openParenthesis()
.openParenthesis()
.greaterOrEqualsThan(LancamentoEntity_.vencimento, dataInicio2016)
.and()
.lessOrEqualsThan(LancamentoEntity_.vencimento, dataFim2016)
.closeParenthesis()
.or()
.openParenthesis()
.greaterOrEqualsThan(LancamentoEntity_.vencimento, dataInicio2018)
.and()
.lessOrEqualsThan(LancamentoEntity_.vencimento, dataFim2018)
.closeParenthesis()
.closeParenthesis()
.and()
.greaterOrEqualsThan(LancamentoEntity_.valor, BigDecimal.valueOf(1000))
.collect()
.list();
Collection<LancamentoEntity> lancamentos = LancamentoJpaqlBuilderOutra condição poderia avaliar se existe centro de custo no lançamento:
.newInstance()
.where()
.collectionEmpty(LancamentoEntity_.listaLancamentoPagamento)
.collect()
.list();
Collection<LancamentoEntity> lancamentos = LancamentoJpaqlBuilder
.newInstance()
.where()
.exists(LancamentoEntity_.centroCusto)
.collect()
.list();
Conclusão
Nesse primeiro post sobre a JPQL do JARCH fizemos alguns exemplos de filtros, estes filtros seriam um pouco complicado e verboso sem o uso do JARCH. Essa biblioteca facilita o uso do JPQL, trazendo facilidade para buscas de entidades. No próximo post veremos outros exemplos.
Até mais,