Consulta SQL nativo no Hibernate JPA

11 respostas
K

Galera, to precisando de ajuda. Gostaria de saber como fazer consultas no banco usando criterios no Hibernate. Mas como to achando um pouco complicado com o hibernate puro alquem saberia me dizer como colocar SQL nativo dentro do hibernate? Todos os exemplos que acho na internet usam Session mas eu to usando EntityManger JPA. Por favor, alguem poderia me dar esse presentinho de natal e me ajudar com isso? Rsrs. Obrigado gente, segue o codigo que eu tenho:

package modelo;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class Main {

	public static void main(String[] args) {


		EntityManagerFactory entityFactory = Persistence.createEntityManagerFactory("ProjTCC");
		EntityManager entityManager = entityFactory.createEntityManager();
		entityManager.getTransaction().begin();
		
		// gostaria de usar SQL nativo  nessa bloco
		Funcionario f = entityManager.find(Funcionario.class, 25);
		String nome = f.getNome();
		System.out.print(nome);
		

entityManager.getTransaction().commit();
entityManager.close();
entityFactory.close();

	}

}

11 Respostas

K

Pessoal acabei achando solução aqui… mas quando eu tento buscar mais de uma coluna da base da dados o resultado não aparece no console. aparece só a referencia do objeto tipo [[Ljava.lang.Object;@2031688f]. mas quando eu busco uma coluna só o resultado aperece perfeitamente. Alguem sabe porque isso acontece? Obrigado Gente!!! Feliz natal a todos!

List f = entityManager.createNativeQuery("select nome, dataNascimento from funcionario where matricula=1").getResultList();
		System.out.println(f);
F

Qdo mais de 1 campo forem retornados, terá um array de object;

Como o resultado da sua busca é por PK, logo terá apenas um resultado, poderá utilizar o getSingleResult();

Teste isto:

Iterator i = (Iterator) this.getEntityManager().createNativeQuery("select nome, dataNascimento from funcionario where matricula=1").getSingleResult();

Object objeto = i.next();

//no seu objeto de funcionario
Funcionario f = new Funcionario();
f.setNome(objeto[0]);
f.setDataNascimento(objeto[1]);
F

Embora para este caso não vejo o pq de se usar nativeQuery.

O find é bastante performático além de agilizar o seu desenvolvimento, já te devolverá o objeto com todos os atributos.

K

já cheguei a usar o find nesse caso, mas essa query que vc está vendo aqui é só um exemplo, as queries que quero fazer são bem mais elaboradas. Eu sei que da pra fazer com hibernate puro, mas sinceramente não sei fazer. é mais facil fazer consultas complicadas so hibernate apenas? Tu tem algum tutorial simples ensinando isso? Abs!

P

Para listar os funcionarios usando criteria do jpa ficar mais ou menos assim:

public List<Funcionario> listar() {
		CriteriaBuilder criterio = entityManager.getCriteriaBuilder();
		CriteriaQuery<Funcionario> query = criterio.createQuery(Funcionario.class);
		Root<Funcionario> tabelaFuncionario = query.from(Funcionario.class);
		query.select(tabelaFuncionario);
		TypedQuery<Funcionario> typedQuery = entityManager.createQuery(query);
		return typedQuery.getResultList();
	}

Pode parecer complicado de início, mas para querys mais elaboradas vc começa a ver que é mais intuitiva e mais fácil de fazer manutenção, sem contar que retira o SQL do código, tornando a migração de banco mais fácil.

K

Pow cara, valeu pela ideia, mas eu tava tentando fazer assim mas nao consegui. vc poderia me explicar melhor como ficaria a busca assim? posso eu colocaria as clausulas? Abs!

P

me fala qual consulta vc quer saber q eu tento te passar um exemplo, mas basicamente os critérios de buscas são chamadas de métodos, por exemplo
CriteriaBuilder.sum(campo),CriteriaBuilder.like(“algo”),CriteriaQuery.where(alguma condicao) e etc…

A

Em se tratando de Creterias, o Hibernate puro é melhor solução, não?

K

Por exemplo: caso que queria fazer essa busca:

select id, dataNascimento from funcionario where nome=‘Marcio’

como ficaria essa query em Hibernate puro?

Obrigado pela ajuda!

P

ficaria algo como:

public Funcionario buscarPorNome(String nomeFuncionario) {  
        CriteriaBuilder criterio = entityManager.getCriteriaBuilder();  
        CriteriaQuery<Funcionario> query = criterio.createQuery(Funcionario.class);  
        Root<Funcionario> tabelaFuncionario = query.from(Funcionario.class);  

	Path<String> nome= tabelaFuncionario .get("nome");

        Predicate condicao = criterio.like(nome, nomeFuncionario);	

        query.select(tabelaFuncionario).where(condicao);  

        TypedQuery<Funcionario> typedQuery = entityManager.createQuery(query);  
        return typedQuery.getSingleResult();  
  }

agora se vc quer que retorne apenas campos específicos ao invés de retornar todas as colunas do banco (acho difícil pensar em um caso que isso realmente fosse necessário), eu realmente não sei, eu criaria um objeto apenas com os atributos que eu quero que retorno e tipava no TypedQuery.

P

andredecotia acredito que não, a criteria do jpa é mais tipada, evitando muitos casts e com maior segurança, sem contar que sempre é melhor usar o padrão da linguagem. E se um dia ele resolva mudar para EclipseLink??

Criado 25 de dezembro de 2010
Ultima resposta 7 de jan. de 2011
Respostas 11
Participantes 4