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

Java HQL查询中的Hibernate表未映射错误,java,eclipse,spring,hibernate,hibernate-mapping,Java,Eclipse,Spring,Hibernate,Hibernate Mapping,我有一个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

我有一个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;
    ...
}

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

在Spring配置的typo
applicationContext.xml
中,配置的
sessionFactory
将此属性放置在其中

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

异常消息显示:

未映射帐簿[从帐簿中选择计数(*)];嵌套异常为org.hibernate.hql.ast.QuerySyntaxException:未映射图书[从图书中选择计数(*)]

书籍
未映射。也就是说,没有名为
Books
的映射类型

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

因此,将查询更改为:

从书本中选择计数(*)

虽然我认为可能需要

从b册中选择计数(b)


如果HQL不支持
*
符号。

谢谢大家。很多好主意。 这是我在Spring和Hibernate中的第一个应用程序。。所以在和我这样的“新手”打交道的时候要有点耐心

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

SELECT COUNT(*) FROM Books

当然,我有这个Spring配置:

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

再次感谢大家

hibernate3.HibernateQueryException:未映射图书[从图书中选择计数(*))

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注释来描述hibernate字段时,我遇到了相反的问题。我的旧XML文件有:

<hibernate-mapping package="...">
    <class name="Person" table="persons" lazy="true">
       ...
</hibernate-mapping>
我当时看到的是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 {

希望这对其他人有所帮助。

这个答案来得晚,但总结了“表未映射”异常中涉及的概念(为了帮助那些遇到这个问题的人,因为它对于hibernate新手来说非常常见)。出现此错误的原因有很多,但我们的目标是解决一些hibernate新手所面临的最常见错误,以节省他们的研究时间。下面我用我自己的例子做一个简单的演示

例外情况:

org.hibernate.hql.internal.ast.QuerySyntaxException: subscriber is not mapped [ from subscriber]
简单地说,这个非常常见的异常只表明以下代码中的查询是错误的

Session session = this.sessionFactory.getCurrentSession();
List<Subscriber> personsList = session.createQuery(" from subscriber").list();
但是查询语法“from subscriber”是正确的,并且表
subscriber
存在。这就引出了一个关键点:

  • 这是一个HQL查询,而不是SQL查询
它是怎样的

HQL使用持久对象及其属性,而不是数据库表和列

由于上面的查询是HQL查询,
订户
应该是实体名而不是表名。因为我的表
subscriber
映射了实体
subscriber
。如果我将代码更改为以下内容,我的问题就会解决:

Session session = this.sessionFactory.getCurrentSession();
List<Subscriber> personsList = session.createQuery(" from Subscriber").list();
Session Session=this.sessionFactory.getCurrentSession();
List personsList=session.createQuery(“来自订阅者”).List();
只是为了不让你感到困惑。请注意,HQL在许多情况下区分大小写。否则在我的情况下它就会起作用

关键词如SELECT、FROM和WHERE等不区分大小写,但不区分大小写 在HQL中,表名和列名等属性区分大小写


要进一步了解hibernate映射的工作原理,请阅读

hibernate对大小写也很挑剔。默认情况下,它将是第一个字母大写的类名。因此,如果您的类被称为
FooBar
,请不要传递
“FooBar”
。您必须通过带有确切大写字母的“FooBar”
,它才能工作。

除了接受的答案外,另一项检查是确保您在sessionFactory.setPackagesToScan(…)中正确引用了您的实体包设置会话工厂时。

请确保您有实体批注和表批注,并在表批注上设置表名

@Entity
@Table(name = "table_name")
public class TableName {

}

我也有同样的问题,取而代之的是@Entity 我使用以下代码来获取记录

    List<Map<String, Object>> list = null;
            list = incidentHibernateTemplate.execute(new HibernateCallback<List<Map<String, Object>>>() {

            @Override
            public List<Map<String, Object>> doInHibernate(Session session) throws HibernateException {
                Query query = session.createSQLQuery("SELECT * from table where appcode = :app");
                    query.setParameter("app", apptype);
                query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
                return query.list();

                }
            });
List=null;
list=incidentHibernateTemplate.execute(新的HibernateCallback(){
@凌驾
公共列表doInHibernate(会话会话)引发HibernateeException{
Query Query=session.createSQLQuery(“从appcode=:app的表中选择*);
query.setParameter(“app”,apptype);
query.setResultTransformer(Transformers.ALIAS\u TO\u ENTITY\u映射);
返回query.list();
}
});
我使用以下代码进行更新

private @Autowired HibernateTemplate incidentHibernateTemplate;
Integer updateCount = 0;

    updateCount = incidentHibernateTemplate.execute((Session session) -> {
        Query<?> query = session
                    .createSQLQuery("UPDATE  tablename SET key = :apiurl, data_mode = :mode WHERE apiname= :api ");
          query.setParameter("apiurl", url);
          query.setParameter("api", api);
          query.setParameter("mode", mode);
            return query.executeUpdate();
        }
    );
private@Autowired HibernateTemplate incidentHibernateTemplate;
整数updateCount=0;
updateCount=incidentHibernateTemplate.execute((会话)->{
查询=会话
.createSQLQuery(“更新tablename设置键=:apiurl,数据_模式=:模式,其中apiname=:api”);
setParameter(“apirl”,url);
query.setPar
@Entity
@Table(name = "table_name")
public class TableName {

}
    List<Map<String, Object>> list = null;
            list = incidentHibernateTemplate.execute(new HibernateCallback<List<Map<String, Object>>>() {

            @Override
            public List<Map<String, Object>> doInHibernate(Session session) throws HibernateException {
                Query query = session.createSQLQuery("SELECT * from table where appcode = :app");
                    query.setParameter("app", apptype);
                query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
                return query.list();

                }
            });
private @Autowired HibernateTemplate incidentHibernateTemplate;
Integer updateCount = 0;

    updateCount = incidentHibernateTemplate.execute((Session session) -> {
        Query<?> query = session
                    .createSQLQuery("UPDATE  tablename SET key = :apiurl, data_mode = :mode WHERE apiname= :api ");
          query.setParameter("apiurl", url);
          query.setParameter("api", api);
          query.setParameter("mode", mode);
            return query.executeUpdate();
        }
    );