Hibernate Native Query, executando SQL Nativo com Hibernate
Existem situações em que é necessário utilizar query ou SQL nativo mesmo utilizando Hibernate
Última atualização em: | 11385 Visualizações
Existem situações em que é necessário utilizar query ou SQL nativo mesmo utilizando Hibernate. Geralmente em casos mais complexos que precisam de mais detalhes no SQL, subselect ou outras situações.
Para resolver este problema, podemos de uma maneira simples executar query nativas e retornar listas de objetos, fazendo uso dos objetos relacionais do hibernate.
Vamos ao exemplo, considere o seguinte modelo de objeto (POJO).
@Entity
public class Cliente {
@Id
private int id;
private String nome;
private String endereco;
private Double salario;
// getter e setter
}
Para o tabela de banco de dados, considere o seguinte SQL:
create table CLIENTE (
id INT NOT NULL auto_increment,
nome VARCHAR(60) default NULL,
endereco VARCHAR(200) default NULL,
salario NUMBER default NULL,
PRIMARY KEY (id)
);
Finalmente pode ser executado SQL Nativo e converter para o objeto em questão.
public void listCliente( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
String sql = "SELECT nome, salario FROM CLIENTE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List data = query.list();
for(Object object : data) {
Map row = (Map)object;
System.out.print("Nome: " + row.get("nome"));
System.out.println(", Salario: " + row.get("salario"));
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
Ou pode ser utilizado da seguinte forma, o que facilita ainda mais a vida do desenvolvedor:
public void listCliente( ){
Session session = factory.openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
String sql = "SELECT * FROM CLIENTE";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Cliente.class);
List clientes = query.list();
for (Iterator iterator = clientes.iterator(); iterator.hasNext();){
Cliente cliente = (Cliente) iterator.next();
System.out.print("Nome: " + cliente.getFirstName());
System.out.print("Endereco: " + cliente.getLastName());
System.out.println("Salario: " + cliente.getSalary());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
Mesmo com tanta comodidade e praticidade em desenvolver utilizando Hibernate, ainda é possível criar querys nativas o que pode ser muito útil em situações inusitadas durante o desenvolvimento de um sistema.
Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.