Estoy tratando de obtener una lista de todos los usuarios de la tabla "usuarios" y aparece el siguiente error:
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)
Este es el código que escribí para agregar / obtener usuarios:
public List<User> getUsers() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<User> result = (List<User>) session.createQuery("from users").list();
session.getTransaction().commit();
return result;
}
public void addUser(User user) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
}
public void addUser(List<User> users) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
for (User user : users) {
session.save(user);
}
session.getTransaction().commit();
}
Agregar usuarios funciona, pero cuando uso la función getUsers obtengo estos errores.
Este es mi archivo de configuración de hibernación:
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.default_schema">test</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create-drop</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<property name="current_session_context_class">thread</property>
<!-- Mapping files will go here.... -->
<mapping class="model.Company" />
<mapping class="model.Conference" />
<mapping class="model.ConferencesParticipants" />
<mapping class="model.ConferenceParticipantStatus" />
<mapping class="model.ConferencesUsers" />
<mapping class="model.Location" />
<mapping class="model.User" />
</session-factory>
y esta es mi clase de usuario:
@Entity
@Table( name = "Users" )
public class User implements Serializable{
private long userID;
private int pasportID;
private Company company;
private String name;
private String email;
private String phone1;
private String phone2;
private String password; //may be null/empty , will be kept hashed
private boolean isAdmin;
private Date lastLogin;
User() {} //not public on purpose!
public User(int countryID, Company company, String name, String email,
String phone1, String phone2, String password, boolean isAdmin) {
this.pasportID = countryID;
this.company = company;
this.name = name;
this.email = email;
this.phone1 = phone1;
this.phone2 = phone2;
this.password = password;
this.isAdmin = isAdmin;
}
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
public long getUserID() {
return userID;
}
public void setUserID(long userID) {
this.userID = userID;
}
...
}
¿Alguna idea de por qué me sale este error?
Respuestas:
En el HQL, debe usar el nombre de clase de Java y el nombre de propiedad del mapeado en
@Entity
lugar del nombre real de la tabla y el nombre de la columna, por lo que el HQL debería ser:Actualización: para ser más precisos, debe usar el nombre de la entidad configurado
@Entity
para referirse a la "tabla", que por defecto es el nombre no calificado de la clase de Java asignada si no lo establece explícitamente.(PD es
@javax.persistence.Entity
pero no@org.hibernate.annotations.Entity
)fuente
Por ejemplo: su nombre de clase de bean es UserDetails
No da el nombre de su tabla en el Db. le das el nombre de clase de bean .
fuente
Solo para compartir mi hallazgo. Todavía recibí el mismo error incluso si la consulta estaba dirigida al nombre de clase correcto. Más tarde me di cuenta de que estaba importando la clase Entity del paquete incorrecto.
El problema se resolvió después de cambiar la línea de importación de:
a
fuente
@TABLE(name = "TABLE_NAME")
Anotación agregada y corregida. Verifique sus anotaciones y el archivo hibernate.cfg.xml. Este es el archivo de entidad de muestra que funciona:fuente
Existe la posibilidad de que haya olvidado agregar la asignación para la Entidad creada en el
hibernate.cfg.xml
mismo error.fuente
Esto indica que hibernate no conoce a la
User
entidad como "usuarios".La
@Table
anotación establece que el nombre de la tabla sea "Usuarios", pero el nombre de la entidad todavía se conoce en HQL como "Usuario".Para cambiar ambos, debe establecer el nombre de la entidad:
Vea mi respuesta aquí para obtener más información: error de la tabla de hibernación no asignada
fuente
Asegúrese también de que la siguiente propiedad esté establecida en su configuración de bean de hibernación:
Esto le dice a Spring e Hibernate dónde encontrar sus clases de dominio anotadas como entidades.
fuente
Algunas instalaciones de MySQL basadas en Linux requieren mayúsculas y minúsculas. Evitar es aplicar
nativeQuery
.fuente
También estaba importando la entidad incorrecta.
import org.hibernate.annotations.Entity;
Debería ser importarjavax.persistence.Entity;
fuente
También verifique que haya agregado la clase anotada usando:
new Configuration().configure("configuration file path").addAnnotatedClass(User.class)
Eso siempre desperdició mi tiempo al agregar una nueva tabla en la base de datos usando Hibernate.
fuente
Recibía el mismo error mientras Spring con hibernación ... Estaba usando "usuario" en minúsculas en mi
createQuery
declaración y mi clase era Usuario ... Así que lo cambié a Usuario en mi consulta y el problema se resolvió.Consulta antes:
Consulta después de:
fuente
Recibí este problema cuando reemplacé la antigua biblioteca de hibernate-core con hibernate-core-5.2.12. Sin embargo, toda mi configuración estaba bien. Y solucioné este problema creando sessionfactory de esta manera:
Espero que ayude a alguien
fuente
Recomiendo este patrón:
fuente
En su consulta, debe usar el nombre de la clase (Usuario) no el nombre de la tabla (usuarios) para que su consulta sea "del Usuario"
fuente
Debe escribir el mismo nombre en su consulta de selección como su entidad o clase (distingue entre mayúsculas y minúsculas). es decir, seleccionar usuario del usuario className / Entity Name;
fuente
con
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
, está intentando seleccionar de lausers
tabla. Pero estás anotando tu clase con@Table( name = "Users" )
. Entonces useusers
, oUsers
.fuente
Si está utilizando la configuración xml, necesitará algo como lo siguiente en un archivo applicationContext.xml:
fuente