Ajuda com Hibernate TimeStamp [RESOLVIDO]

4 respostas
L

Olá galera,

Tenho os seguintes atributos num objeto Cliente:

@Temporal(TemporalType.TIMESTAMP) private Date atendimento; @Temporal(TemporalType.TIMESTAMP) private Date faturamento; @Temporal(TemporalType.TIMESTAMP) private Date previsaoEntrega; @Temporal(TemporalType.TIMESTAMP) private Date entrega; Que deve ser do tipo TIMESTAMP mesmo porque preciso tanto da hora quanto da data tanto para exibição como para cálculo de períodos. Já tenho um relatório onde listo por ordem de atendimento todos os clientes do mês (fácil) e agora preciso de outro relatório que me liste por exemplo todos os clientes do mês que foram atendidos de manhã (8:00 as 12:00).
Já tenho algumas alternativas (gambiarras) em mente:

  • Listo todos os clientes do mês e faço um for na lista toda pra pegar apenas os de manhã (o que envolve uma conversão de data que pode ficar pesada numa lista grande);
  • Adiciono um outro atributo do tipo Date com o mesmo valor porém mapeado no banco como TemporalType.TIME ( o que aumentará o espaço no banco com uma coluna desnecessária se pensarmos em OO e em redundância de dados, além de ter que replicar o trabalho já que tenho mais de 25 atributos do mesmo tipo somando todas as entidades do meu projeto).
    Alguém tem alguma idéia boa para se fazer um hql ou criteria que filtre a busca apenas pelo horário do Date ignorando a data? Ou uma das gambiarras é realmente a melhor alternativa?
    Obrigado!

4 Respostas

R

Com createSqlQuery, da pra fazer assim:

public Collection<Hora> findByHoraAndData() {
        String i = "'2010-07-01'";
        String f = "'2010-07-31'";
        String h1 = "'08:00:00.000'";
        String h2 = "'12:00:00.000'";

        return getSession().createSQLQuery(
                "SELECT * FROM Horas AS h " +
                        "WHERE CAST( h.data_hora AS TIME ) BETWEEN " + h1 + " AND " + h2 +
                        "AND h.data_hora >= " + i +
                        "AND h.data_hora <= " + f)
                .setResultTransformer(Transformers.aliasToBean(Hora.class))
                .list();
    }

Com HQL assim:

public Collection<Hora> findByHoraAndData() {
        String i = "'2010-07-01'";
        String f = "'2010-07-31'";
        String h1 = "'08:00:00.000'";
        String h2 = "'12:00:00.000'";

        Query q = getSession().createQuery(
                        "FROM Hora " +
                        "AS h " +
                        "WHERE " +
                        "cast(h.data_hora as time) between "+ h1 + " AND " + h2 +        
                        "AND h.data_hora >= " + i +
                        "AND h.data_hora <= " + f
                );
        return q.list();
    }
L

Funcionou!
Valeu Romarcio!!
Agora sabe se esse cast no HQL é do hibernate ou é função do meu SGDB (no caso MySQL) ? Eu perco portabilidade do banco com isso?

R

leosrbrasil:
Funcionou!
Valeu Romarcio!!
Agora sabe se esse cast no HQL é do hibernate ou é função do meu SGDB (no caso MySQL) ? Eu perco portabilidade do banco com isso?

Pelo que sei todos os SGDBs mais conhecidos como MySql, Oracle, DB2, Postgree, possuem essa função. Mas de repente, seria bom fazer um teste se vc tivesse acesso a esses outros além do MySql.

Mas acho que não terá problema.

L

Blz, vou testando no que puder, pelo que vi na documentação do hibernate o cast é portável, o que pode não ser é o tipo para o qual eu faço o cast. Mas acredito que quase todos devem ter o tipo TIME.
Obrigado!

Criado 3 de agosto de 2010
Ultima resposta 4 de ago. de 2010
Respostas 4
Participantes 2