Aniversariantes do mes usando Criteria

17 respostas
J

Pessoal,

Estou precisando fazer uma consulta no meu BD que me retorne os aniversariantes de determinado mes.
Ja tenho o mes para passar como parametro, o problema é como filtrar um campo DATE do MySql apenas com o mes que quero e utilizando Criteria. Isso é possível?

Eu sei que tem uma função do proprio MySQL que me possibilita fazer as comparações apenas com o mes, mesmo sendo um campo DATE, mas alem de não estar achando nem lembrando que função é essa, tambem nao sei como fazer algo parecido com Criteria.

Espero ter sido claro.
Se alguem puder me ajudar, agradeço.

17 Respostas

M

Olha não sei se é o melhor jeito, mas se você ficar algo assim na criteria?

Restrictions.ge("aniversario", primeiroDiaDoMes), Restrictions.le("aniversario", ultimoDiaDoMes)

Você usa a classe Calendar pra pegar o primeiro e o último dia do mês em questão, ai eu acho que funciona ^^ não sei!

J

Nao sei como vou pegar o dia de cada mes, só tenho o numero do mes (por exemplo 1= janeiro). Achei que tinha alguma outra função, porque eu sei que no MySql tem como pegar a data toda e extrair apenas o mes dela e comparar com o que voce tem, mais ou menos isso.

M

Como assim pegar o dia de cada mês? Se for pra pegar o range de dias de um determinado mês vc usa a classe Calendar como eu já havia dito anteriormente.

J
Restrictions.ge("aniversario", primeiroDiaDoMes), Restrictions.le("aniversario", ultimoDiaDoMes)

Nesse exemplo que me deu, voce usa a variavel primeiroDiaDoMes e ultimoDiaDoMes, eu só tenho o mes em numero, por isso falei que não sei como pegar o dia do mes. Na verdade ainda nao consegui aplicar esse teu exemplo

S

JeffersonJCosta:
Restrictions.ge("aniversario", primeiroDiaDoMes), Restrictions.le("aniversario", ultimoDiaDoMes)

Nesse exemplo que me deu, voce usa a variavel primeiroDiaDoMes e ultimoDiaDoMes, eu só tenho o mes em numero, por isso falei que não sei como pegar o dia do mes. Na verdade ainda nao consegui aplicar esse teu exemplo

Vamos lá , pense um pouco. Qual é o primeiro dia do mês ? qualquer mês ? dia 1.

O primeiro dia do mes x é 1 de x
O ultimo dia depende do ano, mas no caso vc pode usar o dia 1 do mes seguinte. A ideia de quem escreveu aquele codigo é vc fazer uma pesquisa que retorna todo o mundo cuja aniversário cai entre o dia 1 do mes corrente inclusive e o ultimo dia do mes corrrente inclusive que é o mesmo que entre o dia 1 do mes corrente inclusive, e o dia 1 do mes seguinte exclusive.

Agora que vc entendeu, vc entende também que esta tecnica não funciona, porque vc não tem o ano para compor o resto da data.

A unica forma é utilizar uma função que lhe retorne o mes da data independentemente do dia ou do ano. Só que para usar isso vc não consegue usar criteria (nem hql eu acho).
Vc teria que carregar todo o mundo e aplicar um filtro java. ou usar SQL nativo para usar as funções do banco explicitamente.

J

Entendi.
Isso que queria saber.
Como posso criar SQL nativo com Hibernate?

S

JeffersonJCosta:
Entendi.
Isso que queria saber.
Como posso criar SQL nativo com Hibernate?

Santo google responde

L

se nao estou equivocado no criteria tem o metodo like que pode ajudar.

Restrictions.like("mes%");

Se for exato tem o enum que Exact que pode ser usado tb.

Se for na documentacao vai achar rapidinnho.

D

Bom, eu recomendaria usar o Restrictions.between(“dt_Aniversario”,$PrimeiroDiaMes,$UltimoDiaMes)); do criteria e sobre as duas variaveis vc pode fazer da seguinte forma.

private int $Ano = Calendar.getInstance().get(Calendar.YEAR);//Devolve o Ano na forma de um inteiro private int $Mes = Calendar.getInstance().get(Calendar.MONTH)+1;////Devolve o Mes atual na forma de um inteiro private Date $PrimeiroDiaMes = new Date($Ano+"/"+$Mes+"/"+Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH)); private Date $UltimoDiaMes = new Date($Ano+"/"+$Mes+"/"+Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH));

Bom eu usei uma variavel inteira para o mes e ano, apenas para nao ficar repetindo todo aquele codigo novamente.
Sobre pegar o ultimo dia de cada vez, e o primeiro existe um método dentro de calendar que devolve para voce o primeiro e ultimo conforme vc pode ver no código acima, espero ter ajudado

F

Sei que o tópico é antigo, mas pode ser que isso ajude alguém no futuro, então segue uma solução que fiz em HQL:

public List<Pessoa> listaAniversariantes(int mes) {
  return this.session.createQuery("select pessoa from Pessoa pessoa " +
    "where month(pessoa.dtnascimento) = " + mes +
    "order by day(pessoa.dtnascimento), pessoa.nome").list();
}
V

tb estou querendo saber mais utilizando o criteria ao invés do query.
alguém fez?

D
viniciuspadua:
tb estou querendo saber mais utilizando o criteria ao invés do query. alguém fez?

Bom dia!

Eu costumo utilizar o Restrictions.between(), e utilizo uma instancia da Classe Calendar sendo que dataMinima é a instancia capturada no inicio da aplicação no meu caso essa data minima é inicida da seguinte forma.

private Calendar dataMinima = Calendar.getInstance(); //Captura da Instancia da Classe Calendar

dataMinima.add(Calendar.MONTH, -3);//Voltei o Calendario da Instancia 3 meses para traz a partir da data atual.

Criteria.add(Restrictions.between("DT_REGISTRO", dataMinima.getTime(), Calendar.getInstance().getTime()));//Pesquisa Criteria
V

Desse modo esta pegando os aniversários do ano corrente.
Quando for pegar os aniversariante tem q desconsiderar o ano.

D

Bom se o caso é esse vc poder usar o Restrictions.sqlRestriction() é um metodo sobrecarregado nele voce so terá que especificar o sql a ser acrescentado a pesquisa que no caso deve ser o Month(dataAniversarios) = mes

Criteria.add(Restrictions.sqlRestriction(" Month(dt_Aniversario)=" + (jmc_mes.getMonth() + 1)))
V

isso volta com o problema inicial que comentei.
nem todos os BD tem essa função month, postgresql é um deles!

D

Bom dia!

Entao meu amigo, nao sei mais o que fazer por voce, ate por que nao é muito normal ficar mudando de banco.

D

Boa Noite

Mano cabei de lembrar usa HQL =]

Criado 16 de junho de 2010
Ultima resposta 19 de nov. de 2011
Respostas 17
Participantes 7