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映射是如何工作的,请阅读