Consultas no Hibernate: Métodos SQL Nativo, HQL e QBC

Este artigo explora as principais técnicas de consulta no Hibernate, um framework ORM para Java. Abordaremos SQL Nativo, HQL (Hibernate Query Language) e QBC (Query By Criteria), demonstrendo como recuperar dados de uma entidade de exemplo.

Entidade e Mapeamento de Exemplo

Consideremos uma classe de modelo simples para representar alunos, com seus respectivos mapeamentos Hibernate.


package com.example.modelo;

public class Aluno {
    private Integer codigo;
    private String nomeCompleto;
    private Integer idade;

    // Construtor padrão
    public Aluno() {}

    // Getters e Setters
    public Integer getCodigo() {
        return codigo;
    }
    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }
    public String getNomeCompleto() {
        return nomeCompleto;
    }
    public void setNomeCompleto(String nomeCompleto) {
        this.nomeCompleto = nomeCompleto;
    }
    public Integer getIdade() {
        return idade;
    }
    public void setIdade(Integer idade) {
        this.idade = idade;
    }

    @Override
    public String toString() {
        return "Aluno [codigo=" + codigo + ", nomeCompleto=" + nomeCompleto + ", idade=" + idade + "]";
    }
}


<hibernate-mapping package="com.example.modelo">
    <class name="Aluno" table="tb_aluno">
        <id name="codigo" column="cod_aluno">
            <generator class="native"/>
        </id>
        <property name="nomeCompleto" column="nome_completo"/>
        <property name="idade" column="idade"/>
    </class>
</hibernate-mapping>

Consultas com SQL Nativo

O SQL Nativo permite executar consultas SQL diretamente no banco de dados, mapeando os resultados para a entidade Hibernate.


import java.util.List;
import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import com.example.modelo.Aluno;

public class ConsultaSQLNativo {

    public List<Aluno> listarTodosAlunos(Session sessao) {
        String sql = "SELECT * FROM tb_aluno";
        NativeQuery<Aluno> consulta = sessao.createNativeQuery(sql, Aluno.class);
        return consulta.getResultList();
    }

    public List<Aluno> buscarAlunosPorNomeEIdade(Session sessao, String padraoNome, int valorIdade) {
        String sql = "SELECT * FROM tb_aluno WHERE nome_completo LIKE :paramNome AND idade = :paramIdade";
        NativeQuery<Aluno> consulta = sessao.createNativeQuery(sql, Aluno.class);
        consulta.setParameter("paramNome", padraoNome);
        consulta.setParameter("paramIdade", valorIdade);
        return consulta.getResultList();
    }
}

Consultas com HQL

HQL é uma linguagem de consulta orientada a objetos que utiliza nomes de classes e propriedades, tornadno as consultas mais portáveis e independentes do banco de dados.


import java.util.List;
import org.hibernate.Session;
import org.hibernate.query.Query;
import com.example.modelo.Aluno;

public class ConsultaHQL {

    public List<Aluno> recuperarTodosAlunos(Session sessao) {
        String hql = "FROM Aluno";
        Query<Aluno> consulta = sessao.createQuery(hql, Aluno.class);
        return consulta.getResultList();
    }

    public List<Aluno> filtrarAlunos(Session sessao, String nomePrefixo, int idadeExata) {
        String hql = "FROM Aluno WHERE nomeCompleto LIKE :nome AND idade = :idade";
        Query<Aluno> consulta = sessao.createQuery(hql, Aluno.class);
        consulta.setParameter("nome", nomePrefixo);
        consulta.setParameter("idade", idadeExata);
        return consulta.getResultList();
    }

    public List<Aluno> listarOrdenadosPorIdade(Session sessao, boolean descendente) {
        String ordem = descendente ? "DESC" : "ASC";
        String hql = "FROM Aluno ORDER BY idade " + ordem;
        Query<Aluno> consulta = sessao.createQuery(hql, Aluno.class);
        return consulta.getResultList();
    }

    public List<Aluno> paginarAlunos(Session sessao, int inicio, int maximo) {
        String hql = "FROM Aluno";
        Query<Aluno> consulta = sessao.createQuery(hql, Aluno.class);
        consulta.setFirstResult(inicio);
        consulta.setMaxResults(maximo);
        return consulta.getResultList();
    }
}

Consultas com QBC (Query By Criteria)

A API Criteria fornece uma maneira segura e baseada em código para construir consultas dinâmicas, evitando a concatenação de strings.


import java.util.List;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import com.example.modelo.Aluno;

public class ConsultaCriteria {

    public List<Aluno> obterTodosAlunos(Session sessao) {
        return sessao.createCriteria(Aluno.class).list();
    }

    public List<Aluno> selecionarAlunosComCriterios(Session sessao, String nomeLike, int idadeIgual) {
        Criterion filtroNome = Restrictions.like("nomeCompleto", nomeLike);
        Criterion filtroIdade = Restrictions.eq("idade", idadeIgual);
        return sessao.createCriteria(Aluno.class)
                     .add(filtroNome)
                     .add(filtroIdade)
                     .list();
    }

    public List<Aluno> ordenarAlunosPorIdade(Session sessao, boolean decrescente) {
        Order ordem = decrescente ? Order.desc("idade") : Order.asc("idade");
        return sessao.createCriteria(Aluno.class)
                     .addOrder(ordem)
                     .list();
    }

    public List<Aluno> limitarResultados(Session sessao, int posicaoInicial, int quantidade) {
        return sessao.createCriteria(Aluno.class)
                     .setFirstResult(posicaoInicial)
                     .setMaxResults(quantidade)
                     .list();
    }
}

Tags: hibernate HQL QBC SQL Nativo ORM

Publicado em 7-4 16:46