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:
packagemodelo;importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.Persistence;publicclassMain{publicstaticvoidmain(String[]args){EntityManagerFactoryentityFactory=Persistence.createEntityManagerFactory("ProjTCC");EntityManagerentityManager=entityFactory.createEntityManager();entityManager.getTransaction().begin();// gostaria de usar SQL nativo nessa blocoFuncionariof=entityManager.find(Funcionario.class,25);Stringnome=f.getNome();System.out.print(nome);entityManager.getTransaction().commit();entityManager.close();entityFactory.close();}}
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
fabiomedeirosf
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:
Iteratori=(Iterator)this.getEntityManager().createNativeQuery("select nome, dataNascimento from funcionario where matricula=1").getSingleResult();Objectobjeto=i.next();//noseuobjetodefuncionarioFuncionariof=newFuncionario();f.setNome(objeto[0]);f.setDataNascimento(objeto[1]);
F
fabiomedeirosf
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
karpyn
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
pablouu
Para listar os funcionarios usando criteria do jpa ficar mais ou menos assim:
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
karpyn
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
pablouu
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
andredecotia
Em se tratando de Creterias, o Hibernate puro é melhor solução, não?
K
karpyn
Por exemplo: caso que queria fazer essa busca:
select id, dataNascimento from funcionario where nome=‘Marcio’
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
pablouu
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??