Hibernate (between inverso) (RESOLVIDO)

10 respostas
R

Boa tarde!!

Gostaria de “traduzir” a query abaixo para o Hibernate, notem que o valor da data(2015-03-01) faria o papel do property name, mas não é, ou seja, quero passar um valor e verificar se ele esta entre dois property name da minha classe “TableName”

SELECT *
FROM table_name
WHERE ‘2015-03-01’ between coluna_data_inicio AND coluna_data_fim;

Desde já agradeço.

10 Respostas

R

Melhor ainda, segue essa apostila de Hibernate. Escrever SQL simples assim não é motivo para abrir um tópico, só colocar no google que tem um montão de exemplos.

R

Boa tarde Rodrigo,

Realmente foi desnecessário todo seu sermão, mas para não ficar um bate boca virtual, depois dá uma olhada no histórico de mensagens postadas/respondidas por mim e você poderá constatar que não sou do tipo que depende que outras pessoas resolvam meus problemas.

Muito obrigado pelo curso de como usar o google!

R

Você esta certo mesmo, depois que eu respondi eu vi que você é membro desde de 2004 e eu só comecei a aprender alguma coisa de programação(nem era programação, era HTML e CSS) foi no inicio do ano passado, hehehe(fiquei sem graça).
Mas isso foi porque o tópico foi meio vago (só hibernate?), e foi uma duvida tão simples, uma coisa que eu fazia o tempo todo quando usava Banco SQL, que achei rapidamente que era algum folgado querendo que escrevesse códigos só para acrescentar no seu projeto. Foi mal, ai.

R

Para deixar o tópico mais rico, gostaria de acrescentar que o link do tutorialspoint do Hibernate que te passei, é um site onde tem uma quantidade absurda de muito material gratuito, para programadores, analistas de dados, front-end e muitos outros cursos de linguagens de programação e todo tipo de banco de dados, inclusive BIG DATA. Você pode conferir tudo na página inicial do tutorialspoint.

L

`acredito que JPQL ficaria assim:

SELECT t FROM Tabela t WHERE t.data BETWEEN :dataIncial AND :dataFinal

`

R

Senhores(ritas), certamente não consegui expôr meu problema, mas agora está bem melhor:

CREATE TABLE tabela(
    id INTEGER,
    dt_inicio DATE,
    dt_fim DATE
)

Query SQL:

SELECT * FROM tabela WHERE '2016-01-01' BETWEEN dt_inicio AND dt_fim;

Java:

@Entity
public class Tabela{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "id_creator")
    @Column(name = "id")
    private Long id;

    @Column(name = "dt_inicio")
    private String dataInicio;

    @Column(name = "dt_fim")
    private String dataFim;

    //getters and setter
}

Query Hibernate:

public class TabelaDAO{
    //CRITERIA --> ERROR: "2016-01-01" could not resolve property
    Criteria crit = session.createCriteria(Tabela.class);
    crit.add(Restrictions.between("2016-01-01", dataInicio, dataFim)); //ERROR: "2016-01-01" could not resolve property
    List results = crit.list();
    
    //HQL --> Testando ainda, mas acredito que vai
    Query query = session.createQuery("FROM Tabela WHERE :dt BETWEEN dataInicio AND dataFim");
    query.setParameter("dt", new Date("2016-01-01"));
    List list = query.list();
}

Resumindo, não consegui fazer a consulta usando criteria, tive que usar HQL

R

Boa noite Luciano, o problema realmente é esse,

SELECT t FROM Tabela t WHERE :variavelDate BETWEEN dtInicio AND dtFim

L

Robinson acredito que os dois pontos irão no :dtInicio e no :dtFim, e depois do WHERE seria o campo de data da tabela t.variavelDate. Dá uma olhada no padrão da data o banco, por default, coloca no padrão americano e vc pode estar passando uma data formatada em outro padrão.

R

Luciano, aí que está o pulo do gato, preciso que uma data qualquer esteja entre o valores dessas propriedades.

Postei um exemplo do código acima(dá uma olhada), vou testar só quarta, aí posto o resultado…

R

Se um dia alguém estiver nessa situação, onde seja necessário verificar se uma “data qualquer” esteja entre os valores de duas colunas data, segue a solução obtida:

public boolean exists(ObjetcFiltro obj) {

        StringBuilder hql = new StringBuilder("");
        hql.append("from Tabela t ");
        hql.append("where t.tipoId = :tipoId ");

        if (obj.getDataInicio() != null) {
            hql.append("and ( :dtInicio between t.dataInicio and t.dataFim ) ");
        }

        if (obj.getDataFim() != null) {
            hql.append("and ( :dtFim between t.dataInicio and t.dataFim ) ");
        }

        Query query = session.createQuery(hql.toString());
        query.setParameter("tipoId", obj.getTipo().getId());

        if (obj.getDataInicio() != null) {
            query.setParameter("dtInicio", obj.getDataInicio());
        }

        if (obj.getDataFim() != null) {
            query.setParameter("dtFim", obj.getDataFim());
        }

        List<?> list = query.list();

        return (list.size() > 0 ? true : false);

    }
Criado 5 de fevereiro de 2016
Ultima resposta 10 de fev. de 2016
Respostas 10
Participantes 3