Pesquisa de aniversariantes por período - JPA 2.0 e Criteria - Resolvido

1 resposta
Adriel

Olá pessoal,

Seguinte, eu tenho que fazer uma consulta dos aniversariantes por período, mas acontece que não tenho como tratar a data para comparar só dia e mês. E quando vou fazer um between ele não retorna nada, pois a data de nascimento do cliente tem o ano diferente dos períodos passados. Não conheço o recurso pra fazer isso usando criteria, gostaria de saber se algum guru que conhece alguma maneira de fazê-lo, caso contrário, com eu faria isso usando JPQL? Segue o método que tenho.

public List<Cliente> listaAniversariantes(Date inicio, Date fim) { CriteriaBuilder cb = this.em.getCriteriaBuilder(); CriteriaQuery<Cliente> cq = cb.createQuery(Cliente.class); EntityType<Cliente> type = em.getMetamodel().entity(Cliente.class); Root<Cliente> root = cq.from(Cliente.class); Expression<Date> dataNascimento = root.get("dataNascimento"); cq.select(root) .where(cb.between(dataNascimento, inicio , fim)) .orderBy( cb.asc(root.get(type.getDeclaredSingularAttribute("id")))); return em.createQuery(cq).getResultList(); }

Desde já o meu Obrigado.

1 Resposta

Adriel

Então pessoal, acabei usando NativeQuery, e usando uma função do banco (h2 db) pra pegar o dia do ano, e fiz um between com o dia inicial e final. A princípio não vou ter grandes desvantagens por ter usado query nativa, por que não vou mudar a base de dados, ela é local e vai embarcada com o sisteminha.

public List<Cliente> listaAniversariantes(Calendar inicio, Calendar fim) { Query q = em .createNativeQuery( "SELECT * FROM CLIENTE WHERE (DAY_OF_YEAR(dataNascimento) BETWEEN :diaInicio AND :diaFim) ORDER BY id ASC", Cliente.class); q.setParameter("diaInicio", inicio.get(Calendar.DAY_OF_YEAR)); q.setParameter("diaFim", fim.get(Calendar.DAY_OF_YEAR)); return q.getResultList(); }

No mais, fica ae o código que criei.

Abraços.

Criado 5 de abril de 2012
Ultima resposta 12 de abr. de 2012
Respostas 1
Participantes 1