JPA映射:“QuerySyntaxException:foobar未映射…”

我一直在玩一个非常简单的JPA例子,并试图调整它到一个现有的数据库。 但是我不能通过这个错误。 (下面)这只是一些简单的事情,我没有看到。

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) 

在下面的DocumentManager类(一个简单的servlet,因为这是我的目标)做两件事情:

  1. 插入一行
  2. 返回所有行

插入工作完美 – 一切都很好。 问题在于检索。 我已经尝试了Query q = entityManager.createQuery参数的各种值,但没有运气,我已经尝试了各种更明确的类注解(如列types),都没有成功。

请救我自己。 我确定这是一个小事。 我对JPA的经验不足使我无法继续前进。

我的./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 } 

我的./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(); } } 

{tomcat-home} /webapps/ROOT/WEB-INF/classes/METE-INF/persistance.xml文件

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

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) 

JPQL 大多是不区分大小写的。 区分大小写的事情之一是Java实体名称。 将您的查询改为:

 "SELECT r FROM FooBar r" 

这个错误还有另一个可能的来源。 在一些J2EE / Web容器中 (根据我在Jboss 7.x和Tomcat 7.x中的经验),您必须将每个要作为hibernate实体使用的类添加到文件persistence.xml

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

在jboss的情况下,这涉及到每个实体类(本地 – 即在您正在开发的项目中或在库中)。 在Tomcat 7.x的情况下,这只涉及库中的实体类。

您已将您的课程声明为:

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

您需要编写search的类名称。
来自FooBar