HQL 查询中的 Hibernate 表未映射错误

新手上路,请多包涵

我有一个使用 Hibernate 对数据库进行 CRUD 操作的 Web 应用程序。我收到一条错误消息,指出该表未映射。查看 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;
    ...
}

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

原文由 Pascut 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 970
2 个回答

异常消息说:

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 的映射类型。

事实上,没有。您的映射类型称为 Book 。它映射到名为 Books 的表,但类型称为 Book 。当您编写 HQL(或 JPQL)查询时,您使用的是类型的名称,而不是表。

因此,将您的查询更改为:

select count(*) from Book

虽然我认为这可能需要

select count(b) from Book b

如果 HQL 不支持 * 符号。

原文由 Tom Anderson 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

Hibernate 试图说它不知道名为“Books”的实体。让我们看看您的实体:

 @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 注释来描述休眠字段时,我遇到了相反的问题。我的旧 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)]

问题是实体名称也被重命名为 persons 。我应该使用以下方法设置表名:

 // 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 {

原文由 Gray 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏