Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate table not mapped error in HQL query

I have a web application that use Hibernate to make CRUD operations over a database. I got an error saying that the table is not mapped. See the Java files:

Error message:

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) ... 

Here's my DAO.java method:

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

How should I modify it in order to work?

like image 399
Pascut Avatar asked Jan 21 '13 19:01

Pascut


People also ask

Does hibernate support union HQL query?

I know hibernate does not support union queries at the moment, right now the only way I see to make a union is to use a view table.

How to handle Hibernate exceptions?

Hibernate provides better handle than the JDBCException . Developers can use the try and catch block to handle the exceptions. Put the line of code that may cause an exception in a try block and according to that exception put the exception handler in the catch block.


2 Answers

The exception message says:

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 is not mapped. That is, that there is no mapped type called Books.

And indeed, there isn't. Your mapped type is called Book. It's mapped to a table called Books, but the type is called Book. When you write HQL (or JPQL) queries, you use the names of the types, not the tables.

So, change your query to:

select count(*) from Book

Although I think it may need to be

select count(b) from Book b

If HQL doesn't support the * notation.

like image 53
Tom Anderson Avatar answered Sep 18 '22 16:09

Tom Anderson


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

Hibernate is trying to say that it does not know an entity named "Books". Let's look at your entity:

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

Right. The table name for Book has been renamed to "Books" but the entity name is still "Book" from the class name. If you want to set the entity name, you should use the @Entity annotation's name instead:

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

That sets both the entity name and the table name.


The opposite problem happened to me when I was migrating from the Person.hbm.xml file to using the Java annotations to describe the hibernate fields. My old XML file had:

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

And my new entity had a @Entity(name=...) which I needed to set the name of the table.

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

What I then was seeing was HQL errors like:

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

The problem with this was that the entity name was being renamed to persons as well. I should have set the table name using:

// 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 { 
like image 31
Gray Avatar answered Sep 19 '22 16:09

Gray