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

我有一个示例 web 应用 Hibernate 4.3.5 + Derby 数据库10.10.1.1 + Glassfish 4.0和 IDE NetBeans 8.0 Beta。

我有下一个例外:

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

来自 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;
}


}

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>
352813 次浏览

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)

最后我发现了一个错误!希望这对某人有用。当对数据库执行请求时(在我的例子中是 ApacheDerby) ,base 的名称需要写成大写字母的第一个字母,其他字母则写成小写。

这个问题是错误的:

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

这是有效的查询

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

类实体必须与数据库同名,但我不确定。

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

即使我们使用了类名,也还有一次机会得到这个异常,例如,如果在不同的包中有两个具有相同名称的类。我们会解决这个问题的。

我认为 hibernate 可能会出现歧义并抛出此异常,因此解决方案是使用完全限定名(如 Com.test. Customerv)

我添加了这个答案,将有助于我提到的情况。我也遇到了同样的情况。

Xml 文件应该具有下面这些表的映射。

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


</hibernate-configuration>
.....

HQL查询中,不要写 表名,在你的查询中写 实体类名称,如

String s = "from Entity_class name";
query qry = session.createUqery(s);

使用 Hibernate 映射类的其他人,请确保在下面的部分中 sessionFactory bean 声明中正确地指向 模特包:

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

None of the other solution worked for me.

即使我不认为这是最好的做法,我不得不这样 把它加到代码里

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

给你

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

如果您碰巧使用 java 进行配置,那么如果您的包级别发生了变化,您可能需要检查下面的 bean声明。例如: com.abc.spring软件包改为 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();
}

对 em.createQuery 方法应使用 Entity 类名 或者 应该对没有实体类的本机查询使用 em.createNativeQuery 方法

使用 Entity 类:

CreateQuery (“ select first _ name from CUSTOMERV”)

没有实体类或本机查询:

CreateNativeQuery (“ select c.first _ name from CUSTOMERV c”)

在我的例子中: Spring 启动2,多个数据源(默认和自定义)。 entityManager.createQuery出错: “实体未被映射”

在调试时,我发现 entityManager 的 unitName 是错误的(应该是自定义的,但事实上是默认的) 正确的方式:

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

那么,entityManager 是正确的。

但是,em.keep (实体)不能工作,而且事务也不能工作。

另一个重要的问题是:

@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来自第二个数据源配置类:

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

第二个数据源配置类是:

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

这意味着您的表没有映射到 JPA。 要么表的 Name 是错误的(可能区分大小写) ,要么需要在 XML 文件中放入一个条目。

快乐编码:)

如果您使用 JPA 注释来创建实体,然后确保表名与@Table 注释一起映射,而不是与@Entity 一起映射。

映射错误:

@Entity(name="DB_TABLE_NAME")
public class DbTableName implements Serializable {
....
....
}

正确映射的实体:

@Entity
@Table(name="DB_TABLE_NAME")
public class DbTableName implements Serializable {
....
....
}

在 Apache Derby DB 中,避免使用表名作为“用户”,因为它们是 Apache Derby 上的保留关键字,但在 MySql 上可以正常工作。

在“查询”中,必须在“查询”的 FROM 子句中指定要从中获取数据的实体类的名称。

List<User> users=session.createQuery("from User").list();

在这里,User 是我的 JavaEntity 类的名称(考虑名称的大小写,因为在 Java 中它很重要)

当我开始使用 Hibernate 时,我也遇到过类似的问题。总而言之,在 createQuery 中,需要传递的是实体类的名称,而不是实体映射到的表名。

在我的例子中,我只是忘记添加 nativeQuery = true

@Query( value = "some sql query ...", nativeQuery = true)

使用 Spring Data JPA 进行 Spring 引导

Another solution that worked:

实际引发此异常的数据访问对象是

public List<Foo> findAll() {
return sessionFactory.getCurrentSession().createQuery("from foo").list();
}

我在上面的代码片段中所犯的错误是在 createQuery 中使用了表名 foo。相反,我使用了 Foo,实际的类名。

public List<Foo> findAll() {
return sessionFactory.getCurrentSession().createQuery("from Foo").list();

感谢这个博客: https://www.arundhaj.com/blog/querysyntaxexception-not-mapped.html

使用 Hibernate 映射类的其他人,请确保在下面的部分中正确地定位到 sessionFactory bean 声明中的模型包:

public List<Book> list() {
List<Book> list=SessionFactory.getCurrentSession().createQuery("from book").list();
return list;
}

The mistake I did in the above snippet is that I have used the table name foo inside createQuery. Instead, I got to use Foo, the actual class name.

public List<Book> list() {
List<Book> list=SessionFactory.getCurrentSession().createQuery("from Book").list();
return list;
}

Add 参数 nativeQuery = true

例如:

@Query(value="Update user set user_name =:user_name,password =:password where user_id =:user_id",nativeQuery = true)

在冬眠,

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

Customerv是你的 实体名称不是你的 表名

在我的例子中的错误是我使用了 session.createQuery()而不是 session.createSQLQuery()