Ya no necesitas indagar más por todo internet ya que has llegado al espacio correcto, tenemos la solución que deseas sin complicarte.
Solución:
El mensaje de excepción dice:
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
no está mapeado. Es decir, que no hay un tipo mapeado llamado Books
.
Y de hecho, no lo hay. Su tipo mapeado se llama Book
. Está asignado a una tabla llamada Books
pero el tipo se llama Book
. Cuando escribe consultas HQL (o JPQL), usa los nombres de los tipos, no las tablas.
Por lo tanto, cambie su consulta a:
select count(*) from Book
Aunque creo que puede ser necesario
select count(b) from Book b
Si HQL no admite el *
notación.
hibernate3.HibernateQueryException: Books is not mapped [SELECT COUNT(*) FROM Books];
Hibernate está tratando de decir que no conoce una entidad llamada “Libros”. Veamos su entidad:
@javax.persistence.Entity
@javax.persistence.Table(name = "Books")
public class Book {
Derecha. los mesa nombre para Book
se ha cambiado el nombre a “Libros”, pero el nombre de la entidad sigue siendo “Libro” del nombre de la clase. Si desea establecer el nombre de la entidad, debe utilizar el @Entity
el nombre de la anotación en su lugar:
// this allows you to use the entity Books in HQL queries
@javax.persistence.Entity(name = "Books")
public class Book {
Eso establece tanto el nombre de la entidad como el nombre de la tabla.
A mí me pasó el problema contrario cuando estaba migrando del Person.hbm.xml
para usar las anotaciones de Java para describir los campos de hibernación. Mi antiguo archivo XML tenía:
...
Y mi nueva entidad tenía un @Entity(name=...)
que necesitaba para establecer el nombre de la tabla.
// this renames the entity and sets the table name
@javax.persistence.Entity(name = "persons")
public class Person {
...
Lo que entonces estaba viendo eran errores HQL como:
QuerySyntaxException: Person is not mapped
[SELECT id FROM Person WHERE id in (:ids)]
El problema con esto era que el nombre de la entidad estaba siendo renombrado a persons
así como. Debería haber establecido el nombre de la tabla usando:
// 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 {
Espero que esto ayude a otros.
Esta respuesta llega tarde, pero resume el concepto involucrado en la excepción de “tabla no asignada” (para ayudar a aquellos que se encuentran con este problema, ya que es muy común para los novatos de hibernación). Este error puede aparecer debido a muchas razones, pero el objetivo es abordar el más común al que se enfrentan varios desarrolladores novatos de hibernación para ahorrarles horas de investigación. Estoy usando mi propio ejemplo para una demostración simple a continuación.
La excepción:
org.hibernate.hql.internal.ast.QuerySyntaxException: subscriber is not mapped [ from subscriber]
En palabras simples, esta excepción muy habitual solo indica que la consulta es incorrecta en el código siguiente.
Session session = this.sessionFactory.getCurrentSession();
List personsList = session.createQuery(" from subscriber").list();
Así es como se declara mi clase POJO:
@Entity
@Table(name = "subscriber")
public class Subscriber
Pero la sintaxis de consulta “de suscriptor” es correcto y la tabla subscriber
existe Lo que me lleva a un key punto:
- Es una consulta HQL, no SQL.
y como se explica aquí
HQL funciona con objetos persistentes y sus propiedades, no con las tablas y columnas de la base de datos.
Dado que la consulta anterior es HQL, la subscriber
se supone que es un nombre de entidad, no un nombre de tabla. Desde que tengo mi mesa subscriber
mapeado con la entidad Subscriber
. Mi problema se resuelve si cambio el código a esto:
Session session = this.sessionFactory.getCurrentSession();
List personsList = session.createQuery(" from Subscriber").list();
Solo para que no te confundas. Tenga en cuenta que HQL distingue entre mayúsculas y minúsculas en varios casos. De lo contrario hubiera funcionado en mi caso.
Las palabras clave como SELECT , FROM y WHERE, etc. no distinguen entre mayúsculas y minúsculas, pero las propiedades como los nombres de tablas y columnas distinguen entre mayúsculas y minúsculas en HQL.
https://www.tutorialspoint.com/hibernate/hibernate_query_language.htm
Para comprender mejor cómo funciona el mapeo de hibernación, lea esto
Si para ti ha sido provechoso nuestro artículo, agradeceríamos que lo compartas con más programadores de esta forma nos ayudas a dar difusión a nuestro contenido.