Hibernate Native Query, executando SQL Nativo com Hibernate

Postado em por Wolmir Cezer Garbin em Hibernate | 111 Visualizações
Última atualização em:

Existem situações em que é necessário utilizar query ou SQL nativo mesmo utilizando Hibernate

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.

Wolmir Cezer Garbin

Wolmir Cezer Garbin


Sou formado em Desenvolvimento de Sistemas para Internet pela faculdade Mater Dei e Pós graduado em Desenvolvimento de sistemas em Java pela UTFPR. Trabalho a mais de 9 anos com desenvolvimento em Java, Android e Web utilizando as principais tecnologias do mercado. Atuo como professor na faculdade Mater Dei, programador na Garbo Software e criador do Receitas de Código.

Ver mais

Posts relacionados


Code Conference

Esta é uma conferência de código realizada na cidade de Pato Branco para dissiminar tendências e informações sobre programação e novas tecnológias

Veja mais sobre o Code Conference

Publique seu post no Receitas de Código

Agora você pode publicar seu post no Receitas de Código e compartilhar seu conhecimento com muitas pessoas!

Quero publicar