Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JPA mapping: "QuerySyntaxException: foobar is not mapped..."

I've been playing around with a very simple JPA example and am trying to tweak it to an existing database. But I can't get past this error. (Below.) It just has to be some simple thing I am not seeing.

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) 

In the DocumentManager class below (a simple servlet, as that is my target goal) does two things:

  1. insert a row
  2. return all rows

The insertion works perfectly--all is good there. The problem is with the retrieval. I've tried all sorts of values for the Query q = entityManager.createQuery parameters, but no luck, and I've tried variously more explicate annotations of the class (like column types), all without success.

Please save me from myself. I'm certain it is something small. My inexperience with JPA is preventing me from going any farther.

My ./src/ch/geekomatic/jpa/FooBar.java file:

@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 } 

My ./src/ch/geekomatic/jpa/DocumentManager.java class

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();     } } 

The {tomcat-home}/webapps/ROOT/WEB-INF/classes/METE-INF/persistance.xml file

<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> 

The MySQL table description:

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) 
like image 840
Stu Thompson Avatar asked Nov 22 '11 16:11

Stu Thompson


People also ask

How is JPA mapping done?

Association mappings are one of the key features of JPA and Hibernate. They model the relationship between two database tables as attributes in your domain model. That allows you to easily navigate the associations in your domain model and JPQL or Criteria queries.

Can JPA return results as a map?

If a given JPA GROUP BY query returns only two columns where one is unique, it's very suitable to return the result as a Java Map. For this, you can use either the Java Stream functionality or the Hibernate-specific ResultTransformer .

What is JPA mapping?

The One-To-One mapping represents a single-valued association where an instance of one entity is associated with an instance of another entity. In this type of association one instance of source entity can be mapped atmost one instance of target entity.

What is bidirectional mapping in JPA?

JPA Relationships can be either unidirectional or bidirectional. This simply means we can model them as an attribute on exactly one of the associated entities or both. Defining the direction of the relationship between entities has no impact on the database mapping.


1 Answers

JPQL mostly is case-insensitive. One of the things that is case-sensitive is Java entity names. Change your query to:

"SELECT r FROM FooBar r" 
like image 113
Chris Avatar answered Sep 19 '22 04:09

Chris