Aniversariantes do mes usando Criteria

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.

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!

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.

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.

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

[quote=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[/quote]

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.

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

[quote=JeffersonJCosta]Entendi.
Isso que queria saber.
Como posso criar SQL nativo com Hibernate?[/quote]

Santo google responde

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

[code]

Restrictions.like(“mes%”); [/code]

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

Se for na documentacao vai achar rapidinnho.

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

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();
}

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

[quote=viniciuspadua]tb estou querendo saber mais utilizando o criteria ao invés do query.
alguém fez?[/quote]

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.

[code]
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[/code]

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

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

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

Bom dia!

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

Boa Noite

Mano cabei de lembrar usa HQL =]