2011-11-22 17 views
45

: "QuerySyntaxException filanca ... eşlenmedi". Ama bu hatayı geçemem. (Aşağıda.) Sadece göremediğim basit bir şey olmalı. Aşağıda DocumentManager sınıfta JPA haritalama: Ben çok basit bir JPA örnekle etrafında oynuyorsun ve varolan veritabanına çimdik çalışıyorum

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) 

(basit servlet, bu benim hedef hedeftir gibi) iki şey yapar:

  1. dönüş bir satır eklemek tüm satırları

Ekleme mükemmel çalışır - hepsi orada iyi. Sorun geri alma ile. Query q = entityManager.createQuery parametresi için her türlü değeri denedim, ancak şans yok, ve sınıfın (sütun türleri gibi) çok daha fazla açıklamalı açıklamalarını başarıya ulaşmadan denedim.

kendimden kaydedin. Eminim küçük bir şey. JPA ile olan deneyimsizliğim, daha uzaklara gitmeme engel oluyor.

Benim ./src/ch/geekomatic/jpa/FooBar.java dosyası:

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

Benim ./src/ch/geekomatic/jpa/DocumentManager.java sınıf

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

dosya /webapps/ROOT/WEB-INF/classes/METE-INF/persistance.xml 210
<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 tablo tanımı:

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) 

cevap

120

JPQL çok harf duyarsızdır. Büyük/küçük harfe duyarlı olanlardan biri de Java varlık isimleridir. Sorgunuzu değiştirmek için:

"SELECT r FROM FooBar r" 
+3

Yani, sınıf adına ve tablo adına değil mi? –

+27

Evet.SQL'e benziyor olsa da, JPA Sorgu Dilini yürütür; Böylece, Tablolardan değil, Varlıklardan seçiyorsunuz. – Chris

+11

*** Benim kahramanım Aralık 2011 için. *** Teşekkürler. Bu konuda bir saatten fazla uçtum ... –

14

Bu hatanın olası bir başka kaynağı da vardır. Sen

olarak bir dosyaya Varlığı hazırda bekletme persistence.xml olarak kullanmak istediğiniz her sınıf eklemek zorunda (JBoss 7.x ve Tomcat 7.x altında benim durumumda) bazı J2EE/web kaplarda yılında JBoss durumunda <class>com.yourCompanyName.WhateverEntityClass</class>

bu her varlık sınıfını (- Sen geliştiriyorlar proje içinde veya bir kütüphanede yani yerel) ile ilgilidir. Tomcat 7.x söz konusu olduğunda, bu yalnızca kütüphaneler içindeki varlık sınıflarını ilgilendirir. Arama için Sınıfı Adını yazmaya gerek

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

: olarak

3

Sen Class ilan etmişlerdir.
FooBar