3
respostas

Find para parte de nome

Estou tentando fazer um programa que pesquisa as informações do banco pelo nome, e não pelo id da minha conta, como o usuário do programa pode não lembrar o nome quero que mostre o resultado da pesquisa dependendo do que ele escreve no campo de texto. a querry ficaria mais ou menos assim "select * from conta where nome like ?%" como posso adaptar essa querry para o jpa?

3 respostas

Em JPQL ao inves de você pensar em tabelas e colunas, você utiliza classes java e atributos das respectivas classes.

Em JPQL você utiliza from para uma classe java, já no sql normal o from é de uma tabela. E o where em JPQL referencia um atributo de uma classe, já no sql referencia uma coluna.

Código com defeito . Corrigido em um post abaixo.


// Instanciação do EntityManager
EntityManagerFactory emf = Persistance.getEntityManager();
EntityManager em = emf.createPersistance();

// Inicio da Transação
em.getTransaction.begin();;


//Criação da String jpql, :cNome é um Named Parameter
String jpql = ("select c from Conta c where c.nome like  :cNome");
Query query = em.createQuery(jpql);
// O primeiro parâmetro do metódo é pra especificar qual é o Named Parameter e o segundo é o valor desse Named Parameter
//  As % é relacionado ao like pra pegar qualquer coisa antes e depois
Query.setParameter("cNome",  "%" + variavelParametro + "%");


// O query.getResultList() ira retornar tudo que foi encontrado no select e você poderá acessar através da lista contas
List<Conta> contas = query.getResultList();

// Confirma as modificações 
em.getTransaction.commit;
// Fecha os recursos
em.close;
emf.close;

// Depois para acessar o resultado é só utilizar a lista contas

Eu estou aprendendo isso agora através da Aula 6 atividade 1 do curso, recomendo dar uma olhada a explicação ta bem mais detalhada la.

Por algum motivo quando testo esse codigo sempre dsar erro no List contas = query.getResultList(); o erro causado e esse:

"Caused by: org.hibernate.InstantiationException: No default constructor for entity: : br.com.exemplo.entity.Cliente"

Eu tinha esquecidos alguns detalhes, fiz novamente e esse código, e dessa vez eu testei então ele está funcionando.


import br.entities.Conta;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Bruno Strano
 */
public class test {

    public static void main(String[] args) {
        // JPAPU - Nome da minha unidade de persistência definido no persistence.xml. A sua provavelmente tem outro nome então terá que alterar aqui.
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAPU");
        EntityManager em = emf.createEntityManager();
// Inicio da Transação
        em.getTransaction().begin();


//Criação da String jpql, :pAgencia é um Named Parameter
        String jpql = ("select c from Conta c where c.agencia like :pAgencia");
// O entity manager cria a query com o jpql passado como parametro
        Query query = em.createQuery(jpql);
// O primeiro parâmetro do metódo é pra especificar qual é o Named Parameter(No caso o Named Parameter que eu quero é o :pAgencia ) e o segundo é o valor desse Named Parameter
//  As % é relacionado ao like pra pegar qualquer coisa antes e depois. 
// Então, eu irei fazer um select por contas que contenham no nome da agencia a String: 123.  
        String valorParametro = "123";
        query.setParameter("pAgencia", "%" + valorParametro + "%");

// O query.getResultList() ira retornar tudo que foi encontrado no select e você poderá acessar através da lista contas
        List<Conta> contas = query.getResultList();

// Depois para acessar o resultado é só utilizar a lista contas     
// Imprimindo na tela para testar
        for(Conta c: contas){
            System.out.println(c.getAgencia());
        }

        // Fecha os recursos
        em.close();
        emf.close();


    }
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software