Ajudinha com consulta JPA

10 respostas
jaissonduarte

ola pessoal
bom seguinte, estou usando o JPA 2.0 para a persistência de dados de um sistema web
o cadastro, alteração e exclusão funcionam tranquilo.

meu problema é na hora das consultas eu fiz uma classe de teste para ver se funciona
podem dar uma olhada e me dizer o que tenho feito de errado pois da esse erro

meu código de teste:

package teste;

import modelo.Area;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

public class TestePesquisas {

    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("cadastroAjaxPU");
    private EntityManager em = emf.createEntityManager();
    private EntityTransaction et = em.getTransaction();

    public Area consultarPorId(String descricao) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        System.out.println(builder);
        CriteriaQuery<Area> criteriaQuery = builder.createQuery(Area.class);
        Root<Area> area = criteriaQuery.from(Area.class);
        criteriaQuery.where(builder.equal(area.get("descricao"), builder.parameter(String.class, "descricao")));
        TypedQuery tq = em.createQuery(criteriaQuery);
        tq.setParameter("descricao", descricao);
        return (Area) tq.getSingleResult();
    }

    public static void main(String[] args) {
        TestePesquisas pesquisas = new TestePesquisas();
        pesquisas.consultarPorId("teste");
    }
}

10 Respostas

igor_ks

Cara, to terminando um projeto agora, que foi escrito quase todas as consultas usando o CriteriaBuilder…

Recomendacao: nao use este troço!! aiuehauieh. Alem de ser complicado, nao te da tanta vantagem assim… vc perde mais tempo escrevendo essa consulta, do que escrever em JPQL e escrever 3 testes unitarios pra ele…

mas de qualquer forma, tente usar o parametro passado por parametro direto

criteriaQuery.where(builder.equal(area.get("descricao"), [i]builder.parameter(String.class, "descricao")[/i] [b]descricao[/b])); //troca o que esta em italico pelo negrito

ai vc pode tirar esse tq.setParameter("descricao", descricao); do final

jaissonduarte

mas tecnicamente o meu método de pesquisa funciona?

jaissonduarte

ai pessoal eu não sei o que esta dando de errado
deem uma olhada no código e me digam o que eu estou fazendo de errado, por favor

package teste;

import modelo.Area;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

/**
 *
 * @author jaisson
 */
public class TestePesquisas {

    private EntityManager em;

    public TestePesquisas(EntityManager em) {
        this.em = em;
    }

    public TestePesquisas() {
    }
    
    

    public Area consultarPorId(String descricao) {
        System.out.println("c 1");
        CriteriaBuilder builder = em.getCriteriaBuilder();
        System.out.println("c 2");
        CriteriaQuery<Area> criteriaQuery = builder.createQuery(Area.class);
        System.out.println("c 3");
        Root<Area> area = criteriaQuery.from(Area.class);
        System.out.println("c 4");
        criteriaQuery.where(builder.equal(area.get("descricao"), descricao));
        System.out.println("c 5");
        TypedQuery tq = em.createQuery(criteriaQuery);
        System.out.println("c 6");
        return (Area) tq.getSingleResult();

    }

    public static void main(String[] args) {
        System.out.println("1");
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("cadastroAjaxPU");
        System.out.println("2");
        EntityManager em = emf.createEntityManager();
        System.out.println("3");
        TestePesquisas pesquisa = new TestePesquisas(em);
        System.out.println("4");
        Area area = new Area();
        System.out.println("5");
        pesquisa.consultarPorId("teste");
        System.out.println("6");
        System.out.println("descrição: " + area.getDescricao());
        System.out.println("7");
    }
}

o erro

igor_ks

O erro nem esta na sua consulta… esta BEEMM antes…

ele nao esta nem conseguindo fazer a conexao com o banco…

Hebert_Coelho

igor_ks:
O erro nem esta na sua consulta… esta BEEMM antes…

ele nao esta nem conseguindo fazer a conexao com o banco…


2

Olha se o usuário/senha estão corretos. Se você está com acesso ao banco de dados.

jaissonduarte

jakefrog:
igor_ks:
O erro nem esta na sua consulta… esta BEEMM antes…

ele nao esta nem conseguindo fazer a conexao com o banco…


2

Olha se o usuário/senha estão corretos. Se você está com acesso ao banco de dados.

pois é foi o que eu percebi quando enchi meu código de sistem.out.println

mas estranho para cadastrar, alterar e excluir ele funciona
Ok vou postar o código na integra para ver se eu posso alterar em algum lugar
e senha e usuario estão tudo Ok se não, não deixaria nem adicionar dados :smiley:

o código full:

package modelo.controleJPA;

import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.transaction.UserTransaction;
import modelo.Area;
import modelo.Curso;
import java.util.ArrayList;
import java.util.List;
import modelo.controleJPA.exceptions.NonexistentEntityException;
import modelo.controleJPA.exceptions.PreexistingEntityException;
import modelo.controleJPA.exceptions.RollbackFailureException;


/**
 *
 * @author jaisson D
 */
public class AreaJpaController implements Serializable {

    public AreaJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;
    
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Area area) throws PreexistingEntityException, RollbackFailureException, Exception {
        ...
    }

    public void editar(Area area) throws NonexistentEntityException, RollbackFailureException, Exception {
        ...
    }

    public void excluir(Integer id) throws NonexistentEntityException, RollbackFailureException, Exception {
        ...
    }

    public List<Area> findAreaEntities() {
        return findAreaEntities(true, -1, -1);
    }

    public List<Area> findAreaEntities(int maxResults, int firstResult) {
        return findAreaEntities(false, maxResults, firstResult);
    }

    private List<Area> findAreaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Area.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Area findArea(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Area.class, id);
        } finally {
            em.close();
        }
    }
    
}

e ai o que acham eu separei a classe que faz a consulta só para não estragar o projeto :slight_smile:

R

Rapaz que API lixo essa do JPA 2.0…Sinceramente…

Prefiro mil vezes as Restrictions do Hibernate:

criteria.add(Restrictions.ilike("fone", filtro.getFone(),MatchMode.ANYWHERE));
jaissonduarte

ola pessoal
alguém sabe fazer uma consulta simples com JPA
por favor

olha o que eu re fiz:
package teste;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import modelo.Area;

/**
 *
 * @author jaisson D
 */
public class NewClass {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("cadastroAjaxPU");
        System.out.println(emf);
        EntityManager em = emf.createEntityManager();
        System.out.println(em);
        System.out.println("1");
        CriteriaBuilder builder = em.getCriteriaBuilder();
        System.out.println("2");
        CriteriaQuery<Area> criteriaQuery = builder.createQuery(Area.class);
        Root<Area> area = criteriaQuery.from(Area.class);
        criteriaQuery.where(builder.equal(area.get("descricao"), builder.parameter(String.class, "descricao")));
        TypedQuery tq = em.createQuery(criteriaQuery);
        tq.setParameter("descricao", "teste");

    }
}

e o erro:


run:
org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl@1f48262
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Documents%20and%20Settings/WinXP/GlassFish_Server/glassfish/modules/weld-osgi-bundle.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Documents%20and%20Settings/WinXP/GlassFish_Server/glassfish/modules/bean-validator.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
07/03/2012 17:50:46 org.hibernate.validator.util.Version
INFO: Hibernate Validator bean-validator-3.0-JBoss-4.0.2
07/03/2012 17:50:47 org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
[EL Info]: 2012-03-07 17:50:47.218--ServerSession(13986615)--EclipseLink, version: Eclipse Persistence Services - 2.0.1.v20100213-r6600
07/03/2012 17:50:54 com.sun.enterprise.transaction.JavaEETransactionManagerSimplified initDelegates
INFO: Using com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate as the delegate
07/03/2012 17:51:07 com.sun.enterprise.connectors.ActiveRAFactory createActiveResourceAdapter
GRAVE: rardeployment.class_not_found
07/03/2012 17:51:07 com.sun.enterprise.connectors.ActiveRAFactory createActiveResourceAdapter
GRAVE:
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR
at com.sun.enterprise.connectors.ActiveRAFactory.createActiveResourceAdapter(ActiveRAFactory.java:104)
at com.sun.enterprise.connectors.service.ResourceAdapterAdminServiceImpl.createActiveResourceAdapter(ResourceAdapterAdminServiceImpl.java:216)
at com.sun.enterprise.connectors.ConnectorRuntime.createActiveResourceAdapter(ConnectorRuntime.java:349)
at com.sun.enterprise.resource.naming.ConnectorObjectFactory.getObjectInstance(ConnectorObjectFactory.java:108)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
at com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:472)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:437)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:569)
at javax.naming.InitialContext.lookup(InitialContext.java:396)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:110)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
at teste.NewClass.main(NewClass.java:47)
Caused by: java.lang.ClassNotFoundException: com.sun.gjc.spi.ResourceAdapter
[EL Severe]: 2012-03-07 17:51:08.609--ServerSession(13986615)--Local Exception Stack:
Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [biblioteca].
Internal Exception: javax.naming.NamingException: Lookup failed for 'biblioteca' in SerialContext ,orb'sInitialHost=localhost,orb'sInitialPort=3700 [Root exception is javax.naming.NamingException: Failed to look up ConnectorDescriptor from JNDI [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR]]
at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:451)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:116)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at com.sun.enterprise.connectors.ActiveRAFactory.createActiveResourceAdapter(ActiveRAFactory.java:96)
... 18 more
Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [biblioteca].
Internal Exception: javax.naming.NamingException: Lookup failed for 'biblioteca' in SerialContext ,orb'sInitialHost=localhost,orb'sInitialPort=3700 [Root exception is javax.naming.NamingException: Failed to look up ConnectorDescriptor from JNDI [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR]]
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:397)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
at teste.NewClass.main(NewClass.java:47)
Caused by: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Cannot acquire data source [biblioteca].
Internal Exception: javax.naming.NamingException: Lookup failed for 'biblioteca' in SerialContext ,orb'sInitialHost=localhost,orb'sInitialPort=3700 [Root exception is javax.naming.NamingException: Failed to look up ConnectorDescriptor from JNDI [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR]]
at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:451)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:116)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:151)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:207)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:195)
at teste.NewClass.main(NewClass.java:47)
Caused by: javax.naming.NamingException: Lookup failed for 'biblioteca' in SerialContext ,orb'sInitialHost=localhost,orb'sInitialPort=3700 [Root exception is javax.naming.NamingException: Failed to look up ConnectorDescriptor from JNDI [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR]]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:569)
at javax.naming.InitialContext.lookup(InitialContext.java:396)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:110)
... 9 more
Caused by: javax.naming.NamingException: Failed to look up ConnectorDescriptor from JNDI [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR]
at com.sun.enterprise.resource.naming.ConnectorObjectFactory.getObjectInstance(ConnectorObjectFactory.java:111)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
at com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:472)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:437)
... 12 more
Caused by: com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR
at com.sun.enterprise.connectors.ActiveRAFactory.createActiveResourceAdapter(ActiveRAFactory.java:104)
at com.sun.enterprise.connectors.service.ResourceAdapterAdminServiceImpl.createActiveResourceAdapter(ResourceAdapterAdminServiceImpl.java:216)
at com.sun.enterprise.connectors.ConnectorRuntime.createActiveResourceAdapter(ConnectorRuntime.java:349)
at com.sun.enterprise.resource.naming.ConnectorObjectFactory.getObjectInstance(ConnectorObjectFactory.java:108)
... 15 more
Caused by: java.lang.ClassNotFoundException: com.sun.gjc.spi.ResourceAdapter
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
... 4 more
Caused by: javax.naming.NamingException: Lookup failed for 'biblioteca' in SerialContext ,orb'sInitialHost=localhost,orb'sInitialPort=3700 [Root exception is javax.naming.NamingException: Failed to look up ConnectorDescriptor from JNDI [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR]]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:569)
at javax.naming.InitialContext.lookup(InitialContext.java:396)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:110)
... 9 more
Caused by: javax.naming.NamingException: Failed to look up ConnectorDescriptor from JNDI [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR]
at com.sun.enterprise.resource.naming.ConnectorObjectFactory.getObjectInstance(ConnectorObjectFactory.java:111)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
at com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:472)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:437)
... 12 more
Caused by: com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in creating active RAR
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at com.sun.enterprise.connectors.ActiveRAFactory.createActiveResourceAdapter(ActiveRAFactory.java:96)
... 18 more

at com.sun.enterprise.connectors.ActiveRAFactory.createActiveResourceAdapter(ActiveRAFactory.java:104)
at com.sun.enterprise.connectors.service.ResourceAdapterAdminServiceImpl.createActiveResourceAdapter(ResourceAdapterAdminServiceImpl.java:216)
at com.sun.enterprise.connectors.ConnectorRuntime.createActiveResourceAdapter(ConnectorRuntime.java:349)
at com.sun.enterprise.resource.naming.ConnectorObjectFactory.getObjectInstance(ConnectorObjectFactory.java:108)
... 15 more
Caused by: java.lang.ClassNotFoundException: com.sun.gjc.spi.ResourceAdapter
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at com.sun.enterprise.connectors.ActiveRAFactory.createActiveResourceAdapter(ActiveRAFactory.java:96)
... 18 more
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 38 segundos)

como podem perceber o EntityManager fica vazio não sei por que
alguém tem alguma luz?

Hebert_Coelho

Em nenhum momento você abriu conexão com o banco de dados. [=

jaissonduarte

ai que burrinho da zero para mim :smiley:

Criado 6 de março de 2012
Ultima resposta 8 de mar. de 2012
Respostas 10
Participantes 4