2011-11-22 22 views
45

He estado jugando con un ejemplo de JPA muy simple y estoy tratando de ajustarlo a una base de datos existente. Pero no puedo superar este error. (Abajo). Simplemente tiene que ser algo simple que no estoy viendo.Asignación de JPA: "QuerySyntaxException: foobar no está correlacionado ..."

org.hibernate.hql.internal.ast.QuerySyntaxException: FooBar is not mapped [SELECT r FROM FooBar r] 
    org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180) 
    org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110) 
    org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93) 

En la clase DocumentManager a continuación (un simple servlet, ya que es mi meta objetivo) hace dos cosas:

  1. insertar una fila
  2. devolver todas las filas

El la inserción funciona perfectamente, todo está bien allí. El problema es con la recuperación. He intentado todo tipo de valores para los parámetros Query q = entityManager.createQuery, pero no tuve suerte, y he intentado varias anotaciones más explicadas de la clase (como los tipos de columna), todo sin éxito.

Por favor, sálvame de mí mismo. Estoy seguro de que es algo pequeño. Mi inexperiencia con JPA me impide ir más lejos. archivo

Mi ./src/ch/geekomatic/jpa/FooBar.java:

@Entity 
@Table(name = "foobar") 
public class FooBar { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="id") 
    private int id; 

    @Column(name="rcpt_who") 
    private String rcpt_who; 

    @Column(name="rcpt_what") 
    private String rcpt_what; 

    @Column(name="rcpt_where") 
    private String rcpt_where; 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 

    public String getRcpt_who() { 
     return rcpt_who; 
    } 
    public void setRcpt_who(String rcpt_who) { 
     this.rcpt_who = rcpt_who; 
    } 

    //snip...the other getters/setters are here 
} 

Mi clase ./src/ch/geekomatic/jpa/DocumentManager.java

public class DocumentManager extends HttpServlet { 
    private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ch.geekomatic.jpa"); 

    protected void tearDown() throws Exception { 
     entityManagerFactory.close(); 
    } 

    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
     FooBar document = new FooBar(); 
     document.setRcpt_what("my what"); 
     document.setRcpt_who("my who"); 

     persist(document); 

     retrieveAll(response); 
    } 

    public void persist(FooBar document) { 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     entityManager.getTransaction().begin(); 
     entityManager.persist(document); 
     entityManager.getTransaction().commit(); 
     entityManager.close(); 
    } 

    public void retrieveAll(HttpServletResponse response) throws IOException { 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     entityManager.getTransaction().begin(); 

     // *** PROBLEM LINE *** 
     Query q = entityManager.createQuery("SELECT r FROM foobar r", FooBar.class); 
     List<FooBar> result = q.getResultList(); 

     for (FooBar doc : result) { 
      response.getOutputStream().write(event.toString().getBytes()); 
      System.out.println("Document " + doc.getId() ); 
     } 
     entityManager.getTransaction().commit(); 
     entityManager.close(); 
    } 
} 

El Tomcat {}-hogar /webapps/ROOT/WEB-INF/classes/METE-INF/persistance.xml presentar

<persistence 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" 
    version="2.0"> 

<persistence-unit name="ch.geekomatic.jpa"> 
    <description>test stuff for dc</description> 

    <class>ch.geekomatic.jpa.FooBar</class> 

    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url"  value="jdbc:mysql://svr:3306/test" /> 
     <property name="javax.persistence.jdbc.user"  value="wafflesAreYummie" /> 
     <property name="javax.persistence.jdbc.password" value="poniesRock" /> 

     <property name="hibernate.show_sql"  value="true" /> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
    </properties> 

</persistence-unit> 
</persistence> 

La descripción de la tabla MySQL:

mysql> describe foobar; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| rcpt_what | varchar(255) | YES |  | NULL |    | 
| rcpt_where | varchar(255) | YES |  | NULL |    | 
| rcpt_who | varchar(255) | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 
4 rows in set (0.00 sec) 

Respuesta

120

JPQL mayoría es sensible a las mayúsculas. Una de las cosas que distingue entre mayúsculas y minúsculas es nombres de entidades Java. Cambie su consulta a:

"SELECT r FROM FooBar r" 
+3

Entonces, ¿al nombre de la clase y no al nombre de la tabla? –

+27

Sí.Aunque parece sql, tu lenguaje de consulta JPA en ejecución; entonces estás seleccionando desde Entidades, no desde tablas. – Chris

+11

*** Eres mi héroe para el mes de diciembre de 2011. *** Gracias. He volado más de una hora en esto ... –

14

También hay otra posible fuente de este error. En algunos J2EE/(contenedores web en mi experiencia bajo Jboss 7.x 7.x Tomcat) Hay que añadir cada clase Desea utilizar como hibernar Entidad en el archivo persistence.xml como

<class>com.yourCompanyName.WhateverEntityClass</class>

En el caso de jboss, esto concierne a cada clase de entidad (local, es decir, dentro del proyecto que está desarrollando o en una biblioteca). En el caso de Tomcat 7.x esto concierne solo a las clases de entidad dentro de las bibliotecas.

3

Usted ha declarado su clase como:

@Table(name = "foobar") 
public class FooBar { 

Usted tiene que escribir el nombre de clase para la búsqueda.
de FooBar

Cuestiones relacionadas