Hibernate表没有映射错误

我有一个Web应用程序使用Hibernate在数据库上进行CRUD操作。 我得到一个错误,说这个表没有被映射。 查看Java文件:

错误信息:

org.springframework.orm.hibernate3.HibernateQueryException: Books is not mapped [SELECT COUNT(*) FROM Books]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books] at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:660) at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411) ... Caused by: org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books] at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181) at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:111) at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93) ... 

这是我的DAO.java方法:

 public int getTotalBooks(){ return DataAccessUtils.intResult(hibernateTemplate.find("SELECT COUNT(*) FROM Books")); } 

Book.java

 @Entity @Table(name="Books") public class Book { @Id @GeneratedValue @Column(name="id") private int id; @Column(name="title", nullable=false) private String title; ... } 

我应该如何修改它才能工作?

什么是exception消息说? 它说:

Books is not mapped [SELECT COUNT(*) FROM Books]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books]

这是什么告诉你? 它告诉你Books没有被映射。 也就是说,没有名为Books映射types。

事实上,没有。 您的映射types称为Book 。 它映射到一个名为Books的表,但是这个types被称为Book 。 在编写HQL(或JPQL)查询时,可以使用types的名称,而不是表格。

所以,将您的查询改为:

select count(*) from Book

虽然我认为可能需要

select count(b) from Book b

如果HQL不支持*符号。

从阅读exception消息中可以学到很多东西!

hibernate3.HibernateQueryException: Books is not mapped [SELECT COUNT(*) FROM Books];

Hibernate试图说,它不知道名为“书籍”的实体。 让我们看看你的实体:

 @javax.persistence.Entity @javax.persistence.Table(name = "Books") public class Book { 

对。 Book名已经重命名为“Books”,但实体名称仍然是类名中的“Book”。 如果你想设置实体名称,你应该使用@Entity注释中的名字:

 // this allows you to use the entity Books in HQL queries @javax.persistence.Entity(name = "Books") public class Book { 

这既设置了实体名称又设置了表名。


当我从Person.hbm.xml文件迁移到使用Java注释来描述hibernate字段时,发生了一个稍微不同的问题。 我的旧XML文件有:

 <hibernate-mapping package="..."> <class name="Person" table="persons" lazy="true"> ... </hibernate-mapping> 

而我的新实体有一个@Entity(name=...) ,我认为我需要设置表的名称。

 // this renames the entity and sets the table name @javax.persistence.Entity(name = "persons") public class Person { ... 

然后我看到的是HQL错误,如:

 QuerySyntaxException: Person is not mapped [SELECT id FROM Person WHERE id in (:ids)] 

问题在于实体名称也被重命名。 我应该设置表名称使用:

 // no name = here so the entity can be used as Person @javax.persistence.Entity // table name specified here @javax.persistence.Table(name = "persons") public class Person extends BaseGeneratedId { 

希望这可以帮助别人。

谢谢大家。 很多好主意。 这是我在Spring和Hibernate中的第一个应用程序..所以在处理像我这样的“新手”时多一点耐心。

请阅读Tom Anderson和Roman C.的答案。 他们很好地解释了这个问题。 你们都帮助了我,我replace了

 SELECT COUNT(*) FROM Books 

 select count(book.id) from Book book 

当然,我有这个springconfiguration:

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="packagesToScan" value="extjs.model"/> 

再次感谢你们!

在configurationsessionFactory的Springconfiguration错误applicationContext.xml中放置了这个属性

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="packagesToScan" value="${package.name}"/> 

我面临同样的问题,

在Hibernateconfiguration文件中,我已经给出了类映射,而不是映射文件,并使用FROM TABLE_NAME将其更改为Entity类(映射类)名称后,它为我工作。

这个答案来得晚,但总结了“表未映射”exception(为了帮助那些遇到这个问题,因为它是非常常见的冬眠新手)的概念。 这个错误可能是由于许多原因而出现的,但是目标是解决一些新手hibernate开发者面临的最常见的问题,从而为他们节省数小时的研究。 我正在使用我自己的例子进行简单的演示。

例外:

 org.hibernate.hql.internal.ast.QuerySyntaxException: subscriber is not mapped [ from subscriber] 

简而言之,这种非常常见的exception只会告诉查询在下面的代码中是错误的。

 Session session = this.sessionFactory.getCurrentSession(); List<Subscriber> personsList = session.createQuery(" from subscriber").list(); 

这是我的POJO类是如何声明的:

 @Entity @Table(name = "subscriber") public class Subscriber 

但查询语法“from subscriber”是正确的,并且表subscriber存在。 这使我想到一个关键点:

  • 这是一个HQL查询而不是SQL。

以及如何在这里解释

HQL与持久对象及其属性不一起处理数据库表和列。

由于上面的查询是一个HQL的, subscriber应该是一个实体名称而不是表名。 由于我有我的表subscriber映射与实体Subscriber 。 我的问题解决了,如果我改变了这个代码:

 Session session = this.sessionFactory.getCurrentSession(); List<Subscriber> personsList = session.createQuery(" from Subscriber").list(); 

只是为了防止你感到困惑。 请注意,在许多情况下,HQL是区分大小写的。 否则,它会在我的情况下工作。

像SELECT,FROM和WHERE这样的关键字不区分大小写,但是表格和列名称等属性在HQL中区分大小写。

https://www.tutorialspoint.com/hibernate/hibernate_query_language.htm

为了进一步了解hibernate映射是如何工作的,请阅读