Hibernate ta brincando com meu DATE!

3 respostas
viniciusfaleiro

Mto estranho o que ta acontecendo…

Fiz um form de pesquisa e to passando os campos por Ajax pra um servlet… Enfim…

Eu uso Jquery … datepicker pra escolher a data e depois trato o valor pra gerar um Date dessa maneira abaixo…

Olha q loco… se eu der um print no ano, mes, dia do meu objeto date (getYear…getMonth…) ta tudo certinho… sem erro…

Agora… tava estranhando que não voltava resultado nenhum e então ativei o log de queries do mysql… Daí vem o porém… Se eu dou post numa data 01.10.2009 no log a data ta vindo como 01.11.2009… 0o!!! Já testei de tudo… O que eu faço??

String nome_s = request.getParameter("nome_s");
    String dpto = request.getParameter("dpto");
    String nome_b = request.getParameter("nome_b");
    String rg_b = request.getParameter("rg_b");
    String data = request.getParameter("data");

    Date date = null;

    if(data.contains("/") && !data.isEmpty()){

        StringTokenizer t = new StringTokenizer(data, "/");

        int mes = Integer.parseInt(t.nextToken());
        int dia = Integer.parseInt(t.nextToken());
        int ano = Integer.parseInt(t.nextToken());

        GregorianCalendar gc = new GregorianCalendar();
        gc.setLenient(false);
        gc.set(GregorianCalendar.YEAR, ano);
        gc.set(GregorianCalendar.MONTH, mes);
        gc.set(GregorianCalendar.DATE, dia);

        date = gc.getTime();

    }

    List l = new DocumentDAO().doSearch(id_doc, nome_s, dpto, nome_b, rg_b, date);

Log Mysql para data postada 16.11.2009

4 Execute     [1] select this_.id as id1_1_, this_.axalant as axalant1_1_, this_.cadim as cadim1_1_, this_.ccd as ccd1_1_, this_.citrix as citrix1_1_, this_.data_criacao as data6_1_1_, this_.datamace as datamace1_1_, this_.dir1 as dir8_1_1_, this_.dir1_tipo as dir9_1_1_, this_.dir2 as dir10_1_1_, this_.dir2_tipo as dir11_1_1_, this_.dir3 as dir12_1_1_, this_.dir3_tipo as dir13_1_1_, this_.dpt_g as dpt14_1_1_, this_.dpt_s as dpt15_1_1_, this_.gf_alliance as gf16_1_1_, this_.hora_criacao as hora17_1_1_, this_.id_status as id44_1_1_, this_.internet as internet1_1_, this_.mail_g as mail19_1_1_, this_.mail_s as mail20_1_1_, this_.minitab as minitab1_1_, this_.nome_g as nome22_1_1_, this_.nome_s as nome23_1_1_, this_.obs as obs1_1_, this_.orial as orial1_1_, this_.orial_premium as orial26_1_1_, this_.outlook_e as outlook27_1_1_, this_.outlook_i as outlook28_1_1_, this_.outros as outros1_1_, this_.outros_desc as outros30_1_1_, this_.ramal_g as ramal31_1_1_, this_.ramal_s as ramal32_1_1_, this_.rede as rede1_1_, this_.revogacao as revogacao1_1_, this_.ronda_acesso as ronda35_1_1_, this_.ronda_ponto as ronda36_1_1_, this_.sap_just as sap37_1_1_, this_.sap_perfil as sap38_1_1_, this_.sap_tipo as sap39_1_1_, this_.sap_trans as sap40_1_1_, this_.sawluz as sawluz1_1_, this_.sintel_cli as sintel42_1_1_, this_.sintel_fornec as sintel43_1_1_, statusdocu2_.id as id3_0_, statusdocu2_.desc as desc3_0_, statusdocu2_.msg_mail as msg3_3_0_ from document this_ inner join status_documento statusdocu2_ on this_.id_status=statusdocu2_.id where this_.data_criacao='2009-12-16'

método do DAO que faz o Criteria

public java.util.List doSearch(long id_doc, String nome_s,String dpto,String nome_b,String rg_b,Date date){

        Session session = factory.openSession();
        Criteria criteria = session.createCriteria(Document.class);

        if(id_doc != 0){
           criteria.add(Restrictions.eq("id",id_doc));
        }

        if(!nome_s.isEmpty()){
            criteria.add(Restrictions.like("nomeS", "%" + nome_s + "%"));
        }

        if(!dpto.isEmpty()){
            criteria.add(Restrictions.eq("dptS", dpto));
        }

        if(date!= null){
            System.out.println(date.getMonth());

            criteria.add(Restrictions.eq("dataCriacao", date));
        }

        if(!nome_b.isEmpty() || !rg_b.isEmpty()){

            criteria.setFetchMode("beneficiado", FetchMode.JOIN);

            if(!nome_b.isEmpty()){
                criteria.add(Restrictions.like("nome","%" + nome_b + "%"));
            }

            if(!rg_b.isEmpty()){
                criteria.add(Restrictions.eq("rg",rg_b));
            }
        }

        return criteria.list();

    }

3 Respostas

E

Troque a seguinte aberração:

Date date = null;  
   
   if(data.contains("/") && !data.isEmpty()){  
   
       StringTokenizer t = new StringTokenizer(data, "/");  
   
       int mes = Integer.parseInt(t.nextToken());  
       int dia = Integer.parseInt(t.nextToken());  
       int ano = Integer.parseInt(t.nextToken());  
   
       GregorianCalendar gc = new GregorianCalendar();  
       gc.setLenient(false);  
       gc.set(GregorianCalendar.YEAR, ano);  
       gc.set(GregorianCalendar.MONTH, mes);  
       gc.set(GregorianCalendar.DATE, dia);  
   
       date = gc.getTime();  
   
   }

por esta aqui (ponha os try/catchs adequados)

// Ponha os try/catchs adequados. 
Date date = null;
if (data.contains ("/") && !data.isEmpty()) {
    DateFormat df = new SimpleDateFormat ("MM/dd/yyyy");
    date = df.parse (data);
}

A propósito, você quer realmente MÊS/dia/ano? Acho que você quer DIA/mês/ano; nesse caso, você teria

DateFormat df = new SimpleDateFormat ("dd/MM/yyyy");
C

Os meses na classe Calendar(GregorianCalendar também) são 0-based.
Ou seja, quando vc atribui o valor 10 em

gc.set(Calendar.MONTH, mes);

a data será tratada como o mês de Novembro…

Ler o JavaDoc das classes é saudável :wink:

edit: esquece o edit

viniciusfaleiro

bleh… a velha história do prazo… sem tempo pra fazer e sempre enrosco em algo simples…

Vlw pela ajuda galera…

Criado 18 de novembro de 2009
Ultima resposta 19 de nov. de 2009
Respostas 3
Participantes 3