Erreur Hibernate-QuerySyntaxException: les utilisateurs ne sont pas mappés [à partir des utilisateurs]
Je vais essayer d'obtenir une liste de tous les utilisateurs de table "users" et j'obtiens l'erreur suivante:
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)
C'est le code que j'ai écrit pour ajouter / obtenir des utilisateurs:
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();
}
L'ajout d'utilisateurs fonctionne, mais quand j'utilise la fonction getUsers, j'obtiens ces erreurs.
C'est mon fichier de configuration hibernate:
<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>
Et ceci est ma classe Utilisateur:
@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;
}
...
}
Une idée de pourquoi j'obtiens cette erreur?
12 réponses
Dans le HQL, vous devez utiliser le java class name et property name du @Entity
mappé au lieu du nom réel de la table et du nom de la colonne, de sorte que le HQL devrait être:
List<User> result = (List<User>) session.createQuery("from User").list();
Par exemple: le nom de votre classe bean est UserDetails
Query query = entityManager. createQuery("Select UserName from **UserDetails** ");
Vous ne donnez pas le nom de votre table sur la base de données. vous donnez le nom de classe de bean .
Juste pour partager ma découverte. J'ai toujours eu la même erreur même si la requête ciblait le nom de classe correct. Plus tard, j'ai réalisé que j'importais la classe Entity du mauvais paquet.
Le problème a été résolu après que je change la ligne d'importation de:
import org.hibernate.annotations.Entity;
À
import javax.persistence.Entity;
Ajouté @TABLE(name = "TABLE_NAME")
annotation et fixe. Vérifiez vos annotations et hibernez.cfg.fichier xml. C'est l'exemple de fichier d'entité qui fonctionne:
import javax.persistence.*;
@Entity
@Table(name = "VENDOR")
public class Vendor {
//~ --- [INSTANCE FIELDS] ------------------------------------------------------------------------------------------
private int id;
private String name;
//~ --- [METHODS] --------------------------------------------------------------------------------------------------
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final Vendor vendor = (Vendor) o;
if (id != vendor.id) {
return false;
}
if (name != null ? !name.equals(vendor.name) : vendor.name != null) {
return false;
}
return true;
}
//~ ----------------------------------------------------------------------------------------------------------------
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
public int getId() {
return id;
}
@Basic
@Column(name = "NAME")
public String getName() {
return name;
}
public void setId(final int id) {
this.id = id;
}
public void setName(final String name) {
this.name = name;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
}
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
Cela indique que hibernate ne connaît pas l'entité User
en tant qu ' "utilisateurs".
@javax.persistence.Entity
@javax.persistence.Table(name = "Users")
public class User {
L'annotation @Table
définit le nomde la table Comme "utilisateurs", mais le nom de l'entité est toujours appelé "utilisateur"dans HQL.
Pour changer les deux, vous devez définir le nom de l'entité:
// this sets the name of the table and the name of the entity
@javax.persistence.Entity(name = "Users")
public class User implements Serializable{
Voir ma réponse ici pour plus d'infos: Hibernate table qui n'est pas mappé erreur
Assurez-vous Également que la propriété suivante est définie dans votre hibernate configuration spring:
<property name="packagesToScan" value="yourpackage" />
Cela indique à spring et hibernate où trouver vos classes de domaine annotées en tant qu'entités.
Certaines installations MySQL basées sur Linux nécessitent une sensibilité à la casse. Le contournement consiste à appliquer nativeQuery
.
@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)
Il est possible que vous ayez oublié d'ajouter un mappage pour l'entité créée dans hibernate.cfg.xml
, même erreur.
Vérifiez également que vous avez ajouté la classe annotée en utilisant:
new Configuration().configure("configuration file path").addAnnotatedClass(User.class)
Cela a toujours perdu mon temps lors de l'ajout d'une nouvelle table dans la base de données en utilisant Hibernate.
J'importais aussi la mauvaise entité import org.hibernate.annotations.Entity;
Il devrait être import javax.persistence.Entity;
J'ai eu ce problème lorsque j'ai remplacé l'ancienne bibliothèque hibernate-core par hibernate-core-5.2.12. Cependant, toute ma configuration était ok. Et j'ai résolu ce problème en créant sessionfactory de cette façon:
private static SessionFactory buildsSessionFactory() {
try {
if (sessionFactory == null) {
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure("/hibernate.cfg.xml").build();
Metadata metaData = new MetadataSources(standardRegistry)
.getMetadataBuilder().build();
sessionFactory = metaData.getSessionFactoryBuilder().build();
}
return sessionFactory;
} catch (Throwable th) {
System.err.println("Enitial SessionFactory creation failed" + th);
throw new ExceptionInInitializerError(th);
}
}
J'espère que ça aide quelqu'un
Je recevais la même erreur pendant le printemps avec hibernate..J'utilisais "user" en minuscules dans mon instruction createQuery
et ma classe était User..So changé à L'utilisateur dans ma requête et le problème a été résolu.
Requête avant de l':
Query query= em.createQuery("select u from user u where u.username=:usr AND u.password=:pass",User.class);
Requête après:
Query query= em.createQuery("select u from User u where u.username=:usr AND u.password=:pass",User.class);