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();
}
}