2014-04-11 8 views
38

Ho un'applicazione web di esempio Hibernate 4.3.5 + Database Derby 10.10.1.1+ Glassfish4.0 con IDE NetBeans 8.0Beta.org.hibernate.hql.internal.ast.QuerySyntaxException: tabella non mappata

ho l'eccezione successiva:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped 
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189) 
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109) 
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95) 
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:331) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3633) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3522) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) 
... 72 more 

modulo dal index.xhtml

<h:panelGrid id="panel1" columns="2" border="1" 
       cellpadding="5" cellspacing="1"> 
     <f:facet name="header"> 
      <h:outputText value="Add Customer Information"/> 
     </f:facet> 
     <h:outputLabel value="First Name:"/> 
     <h:inputText value="#{customer.firstName}" id="fn"/> 
     <h:outputLabel value="Last Name:"/> 
     <h:inputText value="#{customer.lastName}" id="ln"/> 
     <h:outputLabel value="Email:"/> 
     <h:inputText value="#{customer.email}" id="eml"/> 
     <h:outputLabel value="Date of Birth:"/> 
     <h:inputText value="#{customer.sd}" id="s"/> 
     <f:facet name="footer"> 
      <h:outputLabel value="#{customer.msg}" id="msg" styleClass="msg"/> 
      <h:commandButton value="Save" action="#{customer.saveCustomer}"> 
      </h:commandButton> 
     </f:facet> 
    </h:panelGrid> 

Customer.java

package com.javaknowledge.entity; 

    import com.javaknowledge.dao.CustomerDao; 
    import java.text.ParseException; 
    import java.text.SimpleDateFormat; 
    import java.util.ArrayList; 
    import java.util.Date; 
    import java.util.List; 
    import javax.faces.bean.ManagedBean; 
    import javax.faces.bean.SessionScoped; 
    import javax.persistence.*;  

    @ManagedBean 
    @SessionScoped 

    public class Customer implements java.io.Serializable { 

    private Integer custId; 
    private String firstName; 
    private String lastName; 
    private String email; 
    private Date dob; 
    private String sd, msg, selectedname; 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 


    public Customer() { 
    } 

    public Customer(String firstName, String lastName, String email, Date dob) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.email = email; 
     this.dob = dob; 
    } 

    public String getSd() { 
     return sd; 
    } 

    public void setSd(String sd) { 
     this.sd = sd; 
    } 

    public Integer getCustId() { 
     return this.custId; 
    } 

    public void setCustId(Integer custId) { 
     this.custId = custId; 
    } 

    public String getFirstName() { 
     return this.firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return this.lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
    @Column(name = "EMAIL") 
    public String getEmail() { 
     return this.email; 
    } 

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

    @Column(name = "DOB") 
    public Date getDob() { 
     return this.dob; 
    } 

    public void setDob(Date dob) { 
     this.dob = dob; 
    } 

    public String getMsg() { 
     return msg; 
    } 

    public void setMsg(String msg) { 
     this.msg = msg; 
    } 

    public String getSelectedname() { 
     return selectedname; 
    } 

    public void setSelectedname(String selectedname) { 
     this.selectedname = selectedname; 
    } 

    public void saveCustomer() { 
     try { 
      Date d = sdf.parse(sd); 
      System.out.println(d); 
      this.dob = d; 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     CustomerDao dao = new CustomerDao(); 
     dao.addCustomer(this); 
     this.msg = "Member Info Saved Successfull!"; 
     clearAll(); 
    } 
    public void updateCustomer() { 
     try { 
      Date d = sdf.parse(sd); 
      System.out.println(d); 
      this.dob = d; 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     CustomerDao dao = new CustomerDao(); 
     dao.updateCustomer(this); 
     this.msg = "Member Info Update Successfull!"; 
     clearAll(); 
    } 
    public void deleteCustomer() { 
     CustomerDao dao = new CustomerDao(); 
     dao.deleteCustomer(custId); 
     this.msg = "Member Info Delete Successfull!"; 
     clearAll(); 
    } 

    public List<Customer> getAllCustomers() { 
     List<Customer> users = new ArrayList<Customer>(); 
     CustomerDao dao = new CustomerDao(); 
     users = dao.getAllCustomers(); 
     return users; 
    } 

    public void fullInfo() { 
     CustomerDao dao = new CustomerDao(); 
     List<Customer> lc = dao.getCustomerById(selectedname); 
     System.out.println(lc.get(0).firstName); 
     this.custId = lc.get(0).custId; 
     this.firstName = lc.get(0).firstName; 
     this.lastName = lc.get(0).lastName; 
     this.email = lc.get(0).email; 
     this.dob = lc.get(0).dob; 
     this.sd = sdf.format(dob); 
    } 

    private void clearAll() { 
     this.firstName = ""; 
     this.lastName = ""; 
     this.sd = ""; 
     this.email = ""; 
     this.custId=0; 
    } 

    } 

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property> 
    <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> 
    <property name="hibernate.connection.url">jdbc:derby://localhost:1527/derbyDB</property> 
    <property name="hibernate.connection.username">user1</property> 
    <property name="hibernate.connection.password">user1</property> 
    <property name="hibernate.hbm2ddl.auto">create</property> 

    <property name="c3p0.min_size">1</property> 
    <property name="c3p0.max_size">5</property> 
    <property name="c3p0.timeout">300</property> 
    <property name="c3p0.max_statements">50</property> 
    <property name="c3p0.idle_test_period">300</property> 

    <mapping class="com.javaknowledge.entity.Customer" resource="com/javaknowledge/entity/Customer.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.javaknowledge.entity.Customer" table="CUSTOMERV" schema="APP"> 
     <id name="custId" type="java.lang.Integer"> 
      <column name="cust_id" /> 
      <generator class="increment" /> 
     </id> 
     <property name="firstName" type="string"> 
      <column name="first_name" length="45" not-null="true" /> 
     </property> 
     <property name="lastName" type="string"> 
      <column name="last_name" length="45" not-null="true" /> 
     </property> 
     <property name="email" type="string"> 
      <column name="email" length="45" not-null="true" /> 
     </property> 
     <property name="dob" type="date"> 
      <column name="dob" length="10" not-null="true" /> 
     </property> 
    </class> 
</hibernate-mapping> 

risposta

57

Finalmente ho trovato un errore! Spero che questo sia utile a qualcuno. Quando si effettua una richiesta al database (nel mio caso Apache Derby), il nome di base deve scrivere la prima lettera maiuscola altro in minuscolo.

Questo è sbagliato interrogazione:

session.createQuery("select first_name from CUSTOMERV"). 

Si tratta di query valida

session.createQuery("select first_name from Customerv"). 

E entità categoria devono essere stesso nome del database, ma non sono sicuro.

+15

Questo potrebbe non essere il motivo. Seleziona c dal cliente c questa è una query fine poichè Customer è il tuo nome di classe e dovremmo scrivere il nome della classe nella query non il nome della tabella. Un'altra cosa nel tuo hibernate.cfg.xml hai dato sia solo una andrebbe bene Si prega di verificare con quello. –

+0

Grazie per il consiglio Shoalib Chikate! –

+0

Si prega di consultare http://stackoverflow.com/questions/35657292/invocation-of-init-method-failed-nested-exception-is-java-lang-illegalargumente – Prateek

0

problema è stato risolto parzialmente. Oltre alla creazione di jdbc/resource (DB Derby) è stato necessario creare il pool di connessioni JDBC per la risorsa db nella console di amministrazione di Glassfish e controllarlo durante il ping. Ora tutte le operazioni CRUD funzionano bene. Controllo, obietta il Cliente nel database aggiungendo correttamente, aggiorna e cancella anche. Ma nel registro di output Glassfish avere stessa eccezione:

SEVERE: org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped [select concat(first_name, ' ', last_name) as name from CUSTOMERV] 
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96) 
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234) 
    ....... 

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped 
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189) 
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109) 
2

Potrebbe essere questo renderà più chiaro, e ovviamente ha anche un senso.

@Entity 
@Table(name = "users") 

/** 
* 
* @author Ram Srinvasan 
* Use class name in NamedQuery 
* Use table name in NamedNativeQuery 
*/ 
@NamedQueries({ @NamedQuery(name = "findUserByName", query = "from User u where u.name= :name") }) 

@NamedNativeQueries({ @NamedNativeQuery(name = "findUserByNameNativeSQL", query = "select * from users u where u.name= :name", resultClass = User.class) }) 
public class User implements Principal { 
... 
} 
1

C'è ancora una possibilità di ottenere tale deroga anche noi utilizzato il nome della classe vale a dire, se abbiamo due classi con lo stesso nome in diversi pacchetti. avremo questo problema

Penso Hibernate può ottenere ambiguità e genera questa eccezione, per cui la soluzione è quella di utilizzare il nome completo qualificato (come com.test.Customerv)

Ho aggiunto questa risposta che vi aiuterà nello scenario come ho già detto . Ho avuto lo stesso scenario rimasto bloccato per qualche tempo.

6

Il file hibernate.cfg.xml deve avere la mappatura per le tabelle come di seguito. Controlla se manca nel tuo file.

...... 
<hibernate-configuration> 
...... 
...... 
    <session-factory> 
...... 
<mapping class="com.test.bean.dbBean.testTableHibernate"/> 
...... 
</session-factory> 

</hibernate-configuration> 
..... 
+0

questo è stato il mio caso, mentre cambiando l'implementazione per lavorare con Oracle DB invece di Derby - con Derby, per qualche ragione, dichiarare entità in persistence.xml non era necessario (mi sembrava logico, dal momento che le entità erano già annotate) (forse è stato a causa di un vecchio driver (ojdbc6)) –

1

in HQL query non scrivere il nome della tabella scrivere il nome della classe entità nella query come String s = "dal nome entity_cllass"; query qry = session.createUqery (s);

Problemi correlati