[Resolvido] Criar consulta com JPA

10 respostas
J
e ai pessoal estou com um problema que me persegue alguém sabe fazer consulta em JPA? sei que desse jeito ele mostra tudo que tiver no banco de dados
@SuppressWarnings({"unchecked", "rawtypes"})
    public List<E> buscarTodos() {
        CriteriaQuery consulta = em.getCriteriaBuilder().createQuery();
        consulta.select(consulta.from(classeEntidade));
        return em.createQuery(consulta).getResultList();
    }

mas e como fazer para pesquisar um determinado texto?
acho que devo criar um método que faz a consulta e outro que apenas mostre o resultado, certo?

eu acho que o método que faz a pesquisa deve ser um método publico que retorna um lista com resultado e como parâmetros recebe uma String certo? tipo assim:
public Entidade pesquisar(String parametros) {
        Entidade resultado = null;
        try {
           //fazer a consulta;
            }
        } catch (Exception e) {
            System.out.println("Erro ao realizar a consulta: " + e.getMessage());
        }
        return resultado;
}

e o metodo que mostra seria publico retorna um List sem parâmetros
tipo assim:

public List<E> buscarPesquisa() {
        CriteriaQuery consulta = em.getCriteriaBuilder().createQuery();

        //realizar a consulta

        return em.createQuery(consulta).getResultList();
}

acho que é assim, ou vocês tem alguma ideia melhor?
valeu

10 Respostas

H

Mano, numa boa. Criteria do JPA é muito furada. É muito ruim a sintaxe do Criteria para JPA. =(

É melhor tu usar JPQL. query ou namedQuery.

J

Pode me mostrar então?

H

Você pode fazer uma consulta utilizando HQL. Ainda vou escrever posts sobre isso, enquanto não faço você poderia olhar esse post aqui por exemplo: http://docs.jboss.org/tools/movies/demos/HQL_JPA-QL_queries/HQL_JPA-QL_queries.htm

J

ei jackfrog
andei estudando o teu código da aplicação web completa
e notei que tu usa namedQuery para o usuário
poderia falar mais sobre isso

H

jaissonduarte:
ei jackfrog
andei estudando o teu código da aplicação web completa
e notei que tu usa namedQuery para o usuário
poderia falar mais sobre isso
Funciona como se fosse uma consulta SQL no banco mas seu retorno é em classe e não linhas.
Só isso mesmo. Fácil e prático.

J

Pena que tu não mostra a pesquisa em ação
bom, pelo menos não do jeito que eu preciso

fazer o que, voa tentar adaptar, fazer umas gambiarras e ver no que vai dar,

H

jaissonduarte:
Pena que tu não mostra a pesquisa em ação
bom, pelo menos não do jeito que eu preciso

fazer o que, voa tentar adaptar, fazer umas gambiarras e ver no que vai dar,

Pretendo escrever um novo post mas só mes que vem utilizando consulta.
Agora eu to acabando TCC e to lascado.

Bem, boa sorte ae.

Aqui tem um livro muito bom e grátis. Você consegue ver: http://books.google.com.br/books?id=fVCuB_Xq3pAC&pg=PA1&hl=pt-BR&source=gbs_toc_r&cad=4#v=onepage&q&f=false

J

Opa
valeu pela dica vou estudar a fundo

H
jaissonduarte:
Opa valeu pela dica vou estudar a fundo
Mano, só para não te deixar na mão vou colocar um código que eu acabei de fazer para meu TCC: Entity:
@Entity
@Table(name = "VISITAS")
@NamedQueries({
		@NamedQuery(name = "Visita.FIND_LIST_COM_TUDO_CARREGADO_POR_CONSULTA", query = "select v from Visita v join fetch v.consulta c left join fetch v.medicamentos left join fetch v.exames where c.id = :consultaId"),
		@NamedQuery(name = "Visita.FIND_COM_TUDO_CARREGADO_POR_CONSULTA", query = "select v from Visita v left join fetch v.medicamentos left join fetch v.exames where V.id = :visitaId") })
public class Visita {

	public final static String FIND_COM_TUDO_CARREGADO_POR_CONSULTA = "Visita.FIND_COM_TUDO_CARREGADO_POR_CONSULTA";
	public final static String FIND_LIST_COM_TUDO_CARREGADO_POR_CONSULTA = "Visita.FIND_LIST_COM_TUDO_CARREGADO_POR_CONSULTA";

    // get/setters/attributos
}
Eu tenho um DAO genérico e um que extends e assim vai. Para não complicar, vou colocar o modo mais fácil. Faça um código como o abaixo:
@Stateless
public class VisitaDAO extends GenericDAO<Visita> {
	
	public VisitaDAO() {
		super(Visita.class);
	}

	// Não esqueça de iniciar em algum momento, ou injetar
	private EntityManager em;
	
	public List<Visita> listaTodasVisitasCarregandoTudo(Integer consultaId) {
		Query query = em.createNamedQuery(Visita.FIND_LIST_COM_TUDO_CARREGADO_POR_CONSULTA);
		
		query.setParameter("consultaId", consultaId);

		List<Visita> result = query.getResultList();
		
		if(result == null){
			result = Collections.emptyList();
		}		
		
		return result;
	}

	public Visita buscarVisitaCarregandoTudo(Integer visitaId) {
		Visita result = null;

		try {
			Query query = em.createNamedQuery(Visita.FIND_COM_TUDO_CARREGADO_POR_CONSULTA);

			query.setParameter("visitaId", visitaId);

			result = (Visita) query.getSingleResult();
		} catch (NoResultException nre){ 
			// do nothing
		} catch (Exception e) {
			System.out.println("Error while running query: " + e.getMessage());
			e.printStackTrace();
		}

		return result;
	}
}
Coloquei aqui rapidinho pois está corrido o dia aqui hoje. Inté+
J

grande jakefrog valeu pela ajuda
eu e meu orientador fizemos algumas alterações no código e agora esta full;
da uma olhada:

A classe modelo:
@Entity
@Table(name = "area")
@NamedQueries({
    @NamedQuery(name = "Area.findByCodigo", query = "SELECT a FROM Area a WHERE a.codigo = :codigo"),
    @NamedQuery(name = "Area.findByDescricao", query = "SELECT a FROM Area a WHERE a.descricao = :descricao")})
public class Area implements Serializable {
    public static final String pesquisarDescricao = "Area.findByDescricao";
    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "codigo")
    @Column(name = "descricao")
    private String descricao;
    ......
a classe DAO:
@Stateless
public class AreaDAO extends GenericDAO<Area> {

    public AreaDAO() {
        super(Area.class);
    }
    @PersistenceContext(name="WebApplication1PU")
    private EntityManager em;
    private Area area;

    public List<Area> pesquisar(String descricao) {
        List<Area> resultado = null;
        try {
            Query consulta = em.createNamedQuery(Area.pesquisarDescricao);

            consulta.setParameter("descricao",descricao);
           
            resultado = consulta.getResultList();
        } catch (Exception e) {
            System.out.println("não deu hehehe: " + e.getMessage());
        }
        return resultado;
    }

}

bem o resto tu sabe como fazer
mas para quem ainda não domina:

a Facade:
package facade;

import java.util.List;
import javax.ejb.Local;
import modelo.Area;

@Local
public interface AreaFacade {
    public abstract void adicionar(Area area);
    public abstract void excluir(Area area);
    public abstract Area alterar(Area area);
    public abstract List<Area> buscarTodos();
    public List<Area> pesquisarArea(String descricao);
}
e a implementação:
package facade;

import dao.AreaDAO;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import modelo.Area;

@Stateless
public class AreaImplementsFacade implements AreaFacade{
    @EJB
    private AreaDAO areaDAO;
    
    @Override
    public void adicionar(Area area) {
        areaDAO.salvar(area);
    }

    @Override
    public void excluir(Area area) {
        areaDAO.excluir(area);
    }

    @Override
    public Area alterar(Area area) {
        return areaDAO.alterar(area);
    }

    @Override
    public List<Area> buscarTodos() {
        return areaDAO.buscarTodos();
    }

    @Override
    public List<Area> pesquisarArea(String descricao) {
        System.out.println("descricao"+descricao);
        return areaDAO.pesquisar(descricao);
    }

}
o Managed Beans:
package managedBeans;

import facade.AreaFacade;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import modelo.Area;

@ManagedBean(name = "areaMB")
@RequestScoped
public class AreaMB {

    @EJB
    private AreaFacade areaFacade;
    private static final String posicao = "Listagem";
    private Area area;
    private List<Area> areas;

    public Area getArea() {
        if (area == null) {
            area = new Area();
        }
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }

    public List<Area> getAreas() {
        return areas;
    }

    public void setAreas(List<Area> areas) {
        this.areas = areas;
    }

    public String adicionar() {
        try {
            areaFacade.adicionar(area);
        } catch (EJBException e) {
            enviarInformacaodeErroUsuario("Ocorreu um erro tente novamente mais tarde");
        }
        enviarInformacaoUsuario("Operação realizada com sucesso: adicionar");
        return posicao;
    }

    public String alterar() {
        try {
            areaFacade.alterar(area);
        } catch (EJBException e) {
            enviarInformacaodeErroUsuario("Ocorreu um erro tente novamente mais tarde");
        }
        enviarInformacaoUsuario("Operação realizada com sucesso: alteração");
        return posicao;
    }

    public String excluir() {
        try {
            areaFacade.excluir(area);
        } catch (EJBException e) {
            enviarInformacaodeErroUsuario("Ocorreu um erro tente novamente mais tarde");
        }
        enviarInformacaoUsuario("Operação realizada com sucesso: exclusão");
        return posicao;
    }

    public List<Area> buscarTodas() {
        return areaFacade.buscarTodos();
    }


    public String pesquisar() {
        try {
            System.out.println("area:" + area.getDescricao());
            //areas = new ArrayList<Area>();

            if (areaFacade.pesquisarArea(area.getDescricao()) != null) {
                areas=areaFacade.pesquisarArea(area.getDescricao());
            }
        } catch (Exception e) {
            enviarInformacaodeErroUsuario("Ocorreu um erro tente novamente mais tarde");
            return "Erro";
        }
        enviarInformacaoUsuario("Operação realizada com sucesso: pesquisa");
        //Area pesquisarArea = areaFacade.pesquisarArea(area.getDescricao());
        return "Resultado";
    }

    public void enviarInformacaoUsuario(String mensagem) {
        FacesContext context = getContext();
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, mensagem, mensagem));
    }

    public void enviarInformacaodeErroUsuario(String mensagem) {
        FacesContext context = getContext();
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem, mensagem));
    }

    private FacesContext getContext() {
        FacesContext context = FacesContext.getCurrentInstance();
        return context;
    }
}
a tela JSF para pesquisar bem simples ta:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:outputText for="descricao" value="Descrição"/><br/>
            <h:inputText id="descricao" value="#{areaMB.area.descricao}" required="true"/><br/>
            <h:commandLink value="pesquisar" action="#{areaMB.pesquisar()}"/>            
        </h:form>
    </h:body>
</html>
e a tela de resultado:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:dataTable value="#{areaMB.areas}" var="area">
                <h:column>
                    <h:outputText value="#{area.descricao}"/>
                </h:column>
            </h:dataTable>
        </h:form>
    </h:body>
</html>

bom fica feio por que é só para pesquisar ai é só personalizar

valeu jakefrog :D

Criado 22 de março de 2012
Ultima resposta 23 de mar. de 2012
Respostas 10
Participantes 2