Estou com um problema enorme e já naveguei por toda a web tentando resolvê-lo.
Tenho o seguinte método:
public List<Grupo> consultarData() throws DAOException {
try {
return this.getSession().createCriteria(Grupo.class).add(
Restrictions.ne("status", "Cancelado")).add(
Restrictions
.eq("data", new Timestamp(new Date().getTime())))
.list();
} catch (final HibernateException e) {
throw new DAOException(e);
}
}
E tenho registros no banco na data de hoje, tanto que ao executar a query que o hibernate gera direto no banco eu consigo resultados:
select
this_.id as id4_0_,
this_.idCooperativa as idCooper6_4_0_,
this_.data as data4_0_,
this_.idDestino as idDestino4_0_,
this_.idFuncionario as idFuncio8_4_0_,
this_.horaPartida as horaPart3_4_0_,
this_.qtdFuncionarios as qtdFunci4_4_0_,
this_.status as status4_0_
from
trabalhoeds.grupo this_
where
this_.status<>'Cancelado'
and this_.data='2011-07-17'
Alguém saberia me responder o motivo do hibernate não conseguir trazer os resultados? Já tentei com java.util.Date, java.sql.Date e agora com java.sql.Timestamp e até agora nada…
Hi… cara acredito que esse problema exista pelo seguinte, quando vc mapea um certo tipo de dado como Date
o MySQL grava no formato yyyy-MM-dd HH:mm:ss e o parâmetro que tu ta passando para a consulta
ta indo so no formato yyyy-MM-dd.
Uma solução seria:
Query query = session.createQuery("from Grupo g WHERE g.data like '2011-07-17%'");
List<Grupo> grupos = query.list();
Realmente quem criou meu banco foi o Hibernate mesmo, eu tinha os HBMs e mandei ele criar o banco pra mim. Depois com o banco criado retirei os HBMs e criei as classes anotadas.
Realmente o Hibernate criou meu campo de data como datetime, mas eu fui na mão e alterei a tabela para ser só date. Com isso, o próprio MySQL alterou todos os registros da minha tabela retirando a hora.
O engraçado é que no banco ele está parseando minhas datas e gravando elas no formato dd/MM/yyyy, como vocês podem ver na figura abaixo:
Daí vocês podem pensar que eu estou viajando e criei meu campo data como varchar, mas como vocês podem ver na seguinte figura, eu criei o campo como date apenas, sem time.
.
Vou tentar sua solução, pois é apenas um trabalho acadêmico, mas realmente queria aprender a solução deste problema, então agradeço se vierem outras soluções.
fala pgioseffi blz… Cara executa um select diretamente no console do MySQL… pelo que eu sei o mysql utiliza o padrão de
datas americano para manipulação desse tipo de dado, sendo assim o formato deveria ser yyyy-MM-dd.
Cara, mais uma vez obrigado pela ajuda. Mas isso eu já fiz, no meu primeiro post eu mostro a query que executei no banco.
O problema é a query que minha aplicação faz. Tô achando q o problema na verdade é o operador.
Fiz um teste e um select onde meu minha cláusula where era data <= ‘yyyy-MM-dd’ and data >= ‘yyyy-MM-dd’, a consulta vinha com resultados errôneos, mas com between funcionou legal.
O problema é que pra menor ou igual não tem outro tipo de operador. Tô desistindo já e tratando o erro no próprio Java, o que é uma pena… =(
Eu mapeei meu campo data com o Temporal.Timestamp. Após mudar todos os parâmetros que iam para o banco para esse tipo, meu problema foi finalmente resolvido.