org.hibernate.hql.internal.ast.QuerySyntaxException: table is not mapped

匿名 (未验证) 提交于 2019-12-03 01:10:02

问题:

I have example web application Hibernate 4.3.5 + Derby database 10.10.1.1+ Glassfish4.0 with IDE NetBeans 8.0Beta.

I have the next exception:

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  

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

回答1:

Finally I found a mistake! Hope this is useful to someone. When doing a request to the database(in my case it Apache Derby), name of base need write the first letter upper case other in lower case.

This is wrong query:

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

This is valid query

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

And class entity must be same name as database, but I'm not sure.



回答2:

hibernate.cfg.xml file should have the mapping for the tables like below. Check if it is missing in your file.

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


回答3:

May be this will make it more clear, and of course makes sense too.

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


回答4:

There is one more chance to get this exception even we used class name i.e., if we have two classes with same name in different packages. we'll get this problem.

I think hibernate may get ambiguity and throws this exception, so the solution is to use complete qualified name(like com.test.Customerv)

I added this answer that will help in scenario as I mentioned. I got the same scenario got stuck for some time.



回答5:

in hql query doesn't write the table name write your entity class name in your query like String s="from entity_cllass name"; query qry=session.createUqery(s);



回答6:

Problem partially was solved. Besides creating jdbc/resource(DB Derby) had to create JDBC Connection Pool for db resource in Glassfish admin console, and check it on pinging. Now all CRUD operation work just fine. I check, object Customer in database adding properly, update and delete too. But in Glassfish output log have same exception:

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) 


回答7:

Other persons that are using mapping classes for Hibernate, Make sure that have addressed correctly to model package in sessionFactory bean declaration in the following part:

<property name="packagesToScan" value="com.mblog.model"></property> 


回答8:

None of the other solution worked for me.

Even if I don't think its the best practice, I Had to add it into the code like this

configuration.addAnnotatedClass(com.myOrg.entities.Person.class);

here

public static SessionFactory getSessionFactory() {     Configuration configuration = new Configuration().configure();      configuration.addAnnotatedClass(com.myOrg.entities.Person.class);      StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()             .applySettings(configuration.getProperties());     SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());     return sessionFactory; } 


回答9:

If you by any chance using java for configuration, you may need to check the below bean declaration if you have package level changes. Eg: com.abc.spring package changed to com.bbc.spring

@Bean     public SessionFactory sessionFactory() {          LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());         //builder.scanPackages("com.abc.spring");    //Comment this line as this package no longer valid.         builder.scanPackages("com.bbc.spring");         builder.addProperties(getHibernationProperties());          return builder.buildSessionFactory();     } 


回答10:

Should use Entity class name for em.createQuery method or Should use em.createNativeQuery method for native query without entity class

With Entity class:

em.createQuery("select first_name from CUSTOMERV")

Without Entity class or Native query:

em.createNativeQuery("select c.first_name from CUSTOMERV c")



回答11:

In my case: spring boot 2 ,multiple datasource(default and custom). entityManager.createQuery go wrong: 'entity is not mapped'

while debug, i find out that the entityManager's unitName is wrong(should be custom,but the fact is default) the right way:

@PersistenceContext(unitName = "customer1") // !important,  private EntityManager em; 

the customer1 is from the second datasource config class:

@Bean(name = "customer1EntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,         @Qualifier("customer1DataSource") DataSource dataSource) {     return builder.dataSource(dataSource).packages("com.xxx.customer1Datasource.model")             .persistenceUnit("customer1")             // PersistenceUnit injects an EntityManagerFactory, and PersistenceContext             // injects an EntityManager.             // It's generally better to use PersistenceContext unless you really need to             // manage the EntityManager lifecycle manually.             // 【4】             .properties(jpaProperties.getHibernateProperties(new HibernateSettings())).build(); } 

Then,the entityManager is right.

But, em.persist(entity) doesn't work,and the transaction doesn't work.

Another important point is:

@Transactional("customer1TransactionManager") // !important public Trade findNewestByJdpModified() {     //test persist,working right!     Trade t = new Trade();     em.persist(t);     log.info("t.id" + t.getSysTradeId());      //test transactional, working right!     int a = 3/0; } 

customer1TransactionManager is from the second datasource config class:

@Bean(name = "customer1TransactionManager") public PlatformTransactionManager transactionManager(         @Qualifier("customer1EntityManagerFactory") EntityManagerFactory entityManagerFactory) {     return new JpaTransactionManager(entityManagerFactory); } 

The whole second datasource config class is :

package com.lichendt.shops.sync;  import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement;  @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "customer1EntityManagerFactory", transactionManagerRef = "customer1TransactionManager",         // 【1】这里写的是DAO层的路径 ,如果你的DAO放在 com.xx.DAO下面,则这里写成 com.xx.DAO         basePackages = { "com.lichendt.customer1Datasource.dao" }) public class Custom1DBConfig {      @Autowired     private JpaProperties jpaProperties;      @Bean(name = "customer1DatasourceProperties")     @Qualifier("customer1DatasourceProperties")     @ConfigurationProperties(prefix = "customer1.datasource")     public DataSourceProperties customer1DataSourceProperties() {         return new DataSourceProperties();     }      @Bean(name = "customer1DataSource")     @Qualifier("customer1DatasourceProperties")     @ConfigurationProperties(prefix = "customer1.datasource") //     // 【2】datasource配置的前缀,对应上面 【mysql的yaml配置】     public DataSource dataSource() {         // return DataSourceBuilder.create().build();         return customer1DataSourceProperties().initializeDataSourceBuilder().build();     }      @Bean(name = "customer1EntityManagerFactory")     public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,             @Qualifier("customer1DataSource") DataSource dataSource) {         return builder.dataSource(dataSource).packages("com.lichendt.customer1Datasource.model") // 【3】这里是实体类的包路径                 .persistenceUnit("customer1")                 // PersistenceUnit injects an EntityManagerFactory, and PersistenceContext                 // injects an EntityManager.                 // It's generally better to use PersistenceContext unless you really need to                 // manage the EntityManager lifecycle manually.                 // 【4】                 .properties(jpaProperties.getHibernateProperties(new HibernateSettings())).build();     }      @Bean(name = "customer1TransactionManager")     public PlatformTransactionManager transactionManager(             @Qualifier("customer1EntityManagerFactory") EntityManagerFactory entityManagerFactory) {         return new JpaTransactionManager(entityManagerFactory);     } } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!