2011-02-13 12 views
7

Creé el bean de entidad con el asistente netbeans y estoy tratando de obtener datos de la base de datos. No importa qué consulta SQL utilizo, no funciona. He intentado utilizar consulta con nombre que fue creado por asistente:Error de sintaxis al analizar una consulta trivial con JPA

@NamedQuery(name = "Usr.findAll", query = "SELECT u FROM Usr u") 

Devuelve:

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [Usr.findAll], line 1, column 0: unexpected token [Usr]. 

Si trato;

SELECT uid FROM usr; 

me sale:

Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing the query [SELECT uid FROM usr;], line 0, column -1: unexpected end of query. 
Internal Exception: MismatchedTokenException(-1!=78) 

e incluso si lo intento:

SELECT * FROM usr 

me sale:

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Syntax error parsing the query [SELECT * FROM usr], line 1, column 7: unexpected token [*]. 

Mi línea para obtener los datos es:

@PersistenceContext 
EntityManager em; 
.... 

em=Persistence.createEntityManagerFactory("SchoolPU").createEntityManager(); 
List users = em.createQuery("SELECT * FROM usr").getResultList(); 

Cualquiera me puede ayudar con este problema trivial?

La clase de entidad Usr:

import java.io.Serializable; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Lob; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 

/** 
* 
* @author danizmax 
*/ 
@Entity 
@Table(name = "USR") 
@NamedQueries({ 
    @NamedQuery(name = "Usr.findAll", query = "SELECT u FROM Usr u"), 
    @NamedQuery(name = "Usr.findByUid", query = "SELECT u FROM Usr u WHERE u.uid = :uid"), 
    @NamedQuery(name = "Usr.findByPassword", query = "SELECT u FROM Usr u WHERE u.password = :password"), 
    @NamedQuery(name = "Usr.findByFistname", query = "SELECT u FROM Usr u WHERE u.fistname = :fistname"), 
    @NamedQuery(name = "Usr.findByLastname", query = "SELECT u FROM Usr u WHERE u.lastname = :lastname"), 
    @NamedQuery(name = "Usr.findByAddress1", query = "SELECT u FROM Usr u WHERE u.address1 = :address1"), 
    @NamedQuery(name = "Usr.findByAddress2", query = "SELECT u FROM Usr u WHERE u.address2 = :address2"), 
    @NamedQuery(name = "Usr.findByPostcode", query = "SELECT u FROM Usr u WHERE u.postcode = :postcode"), 
    @NamedQuery(name = "Usr.findByEmail", query = "SELECT u FROM Usr u WHERE u.email = :email"), 
    @NamedQuery(name = "Usr.findByPhone", query = "SELECT u FROM Usr u WHERE u.phone = :phone")}) 
public class Usr implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "UID", nullable = false, length = 8) 
    private String uid; 
    @Basic(optional = false) 
    @Column(name = "PASSWORD", nullable = false, length = 20) 
    private String password; 
    @Basic(optional = false) 
    @Column(name = "FISTNAME", nullable = false, length = 30) 
    private String fistname; 
    @Basic(optional = false) 
    @Column(name = "LASTNAME", nullable = false, length = 60) 
    private String lastname; 
    @Basic(optional = false) 
    @Column(name = "ADDRESS1", nullable = false, length = 100) 
    private String address1; 
    @Column(name = "ADDRESS2", length = 100) 
    private String address2; 
    @Basic(optional = false) 
    @Lob 
    @Column(name = "CITY", nullable = false) 
    private byte[] city; 
    @Basic(optional = false) 
    @Column(name = "POSTCODE", nullable = false, length = 10) 
    private String postcode; 
    @Column(name = "EMAIL", length = 50) 
    private String email; 
    @Column(name = "PHONE") 
    private Integer phone; 

    public Usr() { 
    } 

    public Usr(String uid) { 
     this.uid = uid; 
    } 

    public Usr(String uid, String password, String fistname, String lastname, String address1, byte[] city, String postcode) { 
     this.uid = uid; 
     this.password = password; 
     this.fistname = fistname; 
     this.lastname = lastname; 
     this.address1 = address1; 
     this.city = city; 
     this.postcode = postcode; 
    } 

    public String getUid() { 
     return uid; 
    } 

    public void setUid(String uid) { 
     this.uid = uid; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getFistname() { 
     return fistname; 
    } 

    public void setFistname(String fistname) { 
     this.fistname = fistname; 
    } 

    public String getLastname() { 
     return lastname; 
    } 

    public void setLastname(String lastname) { 
     this.lastname = lastname; 
    } 

    public String getAddress1() { 
     return address1; 
    } 

    public void setAddress1(String address1) { 
     this.address1 = address1; 
    } 

    public String getAddress2() { 
     return address2; 
    } 

    public void setAddress2(String address2) { 
     this.address2 = address2; 
    } 

    public byte[] getCity() { 
     return city; 
    } 

    public void setCity(byte[] city) { 
     this.city = city; 
    } 

    public String getPostcode() { 
     return postcode; 
    } 

    public void setPostcode(String postcode) { 
     this.postcode = postcode; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public Integer getPhone() { 
     return phone; 
    } 

    public void setPhone(Integer phone) { 
     this.phone = phone; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (uid != null ? uid.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Usr)) { 
      return false; 
     } 
     Usr other = (Usr) object; 
     if ((this.uid == null && other.uid != null) || (this.uid != null && !this.uid.equals(other.uid))) { 
      return false; 
     } 
     return true; 
    } 



    @Override 
    public String toString() { 
     return "org.danizmax.Usr[uid=" + uid + "]"; 
    } 

} 

persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="SchoolPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/school</jta-data-source> 
    <properties> 
    </properties> 
    </persistence-unit> 
</persistence> 

La clase donde uso la entidad:

import java.util.Iterator; 
import java.util.List; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 
import javax.persistence.PersistenceContext; 

/** 
* 
* @author danizmax 
*/ 
@Stateless 
public class ValidatorBean { 

    @PersistenceContext 
    EntityManager em; 

    public ValidatorBean() { 


    } 

    public boolean validate(String user, String pass) { 

     List users = em.createQuery("SELECT * FROM usr").getResultList(); 

     Iterator it = users.iterator(); 

     //ignore the stupid validation it's only to try out JPA 
     while(it.hasNext()){ 
      Usr u = (Usr) it.next(); 

      if(u.getUid().equals(user) && u.getPassword().equals(pass)){ 
       return true; 
      } 
     } 


     return false; 
    } 
} 

ACTUALIZACIÓN: Para ser justo con usted chicos que respondieron y premiaron tu esfuerzo, ahora que realmente aprendí el t ecnología y utilizarlo en el mundo real, decidí cerrar esta respuesta con la concesión de la mejor respuesta que fue mi solución más probable que encontré hace mucho tiempo.

+0

Encontré una solución, pero ya no recuerdo qué era exactamente, solo que tenía algo que ver con el fundido en el código. Si descubro exactamente qué era, lo publicaré como respuesta. – danizmax

Respuesta

4

Sólo su primera consulta es correcta, los otros no lo son JPQL, por lo que deben producir errores. Use una @NamedNativeQuery para SQL.

Por primera consulta, esto no parece ser lo que realmente están usando para obtener el error,

Descripción de excepción: el análisis de error de sintaxis de la consulta [Usr.findAll], la línea 1, columna 0 : token inesperado [Usr].

Nota dice el error "columna 0" es "usr", que parece que se pone el nombre de la consulta en lugar del nombre. Supongo que lo estás haciendo,

em.createQuery ("Usr.findAll"). GetResultList();

Pero debería estar haciendo,

em.createNamedQuery ("Usr.findAll") getResultList (.);

O

em.createQuery ("Seleccionar u de u usr") getResultList (.);

Sede, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL

+0

Su respuesta explica más, ¡felicitaciones! – danizmax

2

¿Cuál es el nombre de clase de la entidad que intentas recuperar? (Quizás necesite mostrar la clase donde colocó el @NamedQuery).

¿Esto es realmente Usr o es quizás User? Si el último es cierto, Select u from User u definitivamente debería funcionar.

Además, no necesita ambos @PersistenceContext y em=Persistence.createEntityManagerFactory(...). Usa cualquiera de esos. Si se encuentra en un entorno administrado, use la variante de inyección. La creación de un administrador de entidades le proporciona un llamado application managed entity manager para el cual su código tiene que hacer mucha más administración para que las cosas funcionen correctamente.

+0

La entidad Usr se creó a partir de la tabla derby existente utilizando el asistente netbeans, así que supongo que hay algo más erróneo, porque mi código es hello world trivial e incluso la autogeneración de las tablas en la base de datos de la clase de entidad tampoco funciona y debería. ¿Cómo sé si estoy en un entorno administrado? – danizmax

+0

Si está implementando en Glassfish y el código en el que aparece @PersistenceContext es un Servlet, ServletFilter, bean administrado JSF, bean CDI o bean EJB, entonces se encuentra en un entorno administrado. Básicamente significa que no crea una instancia de esos objetos con el nuevo operador y solo declara su unidad de persistencia utilizando un archivo persistence.xml. –

+0

Agregué la clase, tenga en cuenta que esta es la clase generada por el asistente de la tabla USR. Debería funcionar, al comprometer datos con la tabla funciona, las declaraciones SQL simplemente no son reconocidas. También agregaré persistence.xml, podría darle la idea de lo que está mal. Estoy usando EclipseLink 2.0 para la conexión. – danizmax

0

EclipseLink tiene una tendencia a dar mensajes de error bastante genéricos o crípticos en problemas de configuración relativamente simples.

Supongo que te falta una referencia a la clase Usr en persistence.xml. Debe agregar la clase o agregar una referencia de ruta que le indique a EclipseLink qué clases procesar para la persistencia.He aquí un ejemplo con una referencia de clase directa:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="SchoolPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/school</jta-data-source> 
    <class>my.package.Usr</class> 
    </persistence-unit> 
</persistence> 

Una referencia de clase es el enfoque más directo, pero puede llegar a ser tedioso de manejar si usted tiene muchas clases.

+0

Intenté que ya ... el resultado es el mismo. La consulta con nombre "Usr.findAll" aún devuelve un error de sintaxis al analizar la consulta [Usr.findAll], línea 1, columna 0: token inesperado [Usr]. Apostaría que hay algo mal con mi instalación de netbeans. – danizmax

0

Tuve el mismo problema. La solución de Strangs -para mí- fue: Toplink trata el "Nombre de tabla" sensible a las mayúsculas y minúsculas cuando se compara con persistence.xml. Por lo tanto, si usa los nombres de las cajas de camello estándar para sus clases de Java, debe usar los mismos nombres de las cajas de camello en su consulta. Me gusta mucho el mensaje de error totalmente engañoso.

+0

He convertido/refactorizado todo a mayúsculas, en bean, entidad, persistance.xml, incluso la base de datos muestra lo mismo y sigo generando Excepción Descripción: Error de sintaxis al analizar la consulta [USR.findAll], línea 1, columna 0: inesperado token [USR]. Tanto para JPA simple ... – danizmax

5

Tuve el mismo problema. En mi caso, utilicé el método
em.createQuery ("Usr.findAll");
en lugar de
em.createNamedQuery ("Usr.findAll");

+0

Acabo de perder 2 horas en lo mismo ... Aunque acepto que el error fue mi culpa, no estoy muy contento con lo poco descriptivo que es el mensaje de error ... – jahroy

1

No estoy seguro si esto te ayudará o no, ya que esta pregunta parece un poco antigua. Sin embargo es posible que desee utilizar en lugar de .createNativeQuery(...).createQuery(...) como en:

List users = em.createNativeQuery("SELECT * FROM usr").getResultList();
0

que tenía un problema como este con mi @NamedQuery. No funcionó en absoluto. Resolví el problema cambiando em.createQuery("anything.anotherthing") por em.createNamedQuery("anything.anotherthing") y ahora está funcionando bien.

Cuestiones relacionadas