Hibernate Native Query, executando SQL Nativo com Hibernate

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

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Hibernate - TUTORIAL

Última atualização em: | 11007 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.


Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!