J'essaie d'obtenir une liste de tous les utilisateurs de la table "utilisateurs" 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 lorsque j'utilise la fonction getUsers, j'obtiens ces erreurs.
Voici 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 voici ma classe d'utilisateurs:
@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 pourquoi je reçois cette erreur?
Dans la HQL, vous devez utiliser le nom de classe Java et nom de propriété du mappage @Entity
au lieu du nom de la table et du nom de la colonne. Le code HQL doit donc être:
List<User> result = (List<User>) session.createQuery("from User").list();
Par exemple: le nom de votre classe de bean est UserDetails
Query query = entityManager. createQuery("Select UserName from **UserDetails** ");
Vous ne donnez pas le nom de votre table sur le Db. vous donnez le nom de classe de haricot .
Juste pour partager ma découverte. J'ai toujours la même erreur même si la requête visait le nom de classe correct. Plus tard, j'ai réalisé que j'importais la classe Entity à partir du mauvais paquet.
Le problème a été résolu après avoir modifié la ligne d'importation de:
import org.hibernate.annotations.Entity;
à
import javax.persistence.Entity;
Ajouté l'annotation @TABLE(name = "TABLE_NAME")
et corrigé. Vérifiez vos annotations et votre fichier hibernate.cfg.xml. Voici un 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;
}
}
Certaines installations MySQL basées sur Linux nécessitent la casse. La solution consiste à appliquer nativeQuery
.
@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)
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 nom table sur "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’informations: Erreur de la table Hibernate non mappée
Assurez-vous également que la propriété suivante est définie dans la configuration de votre bean hibernate:
<property name="packagesToScan" value="yourpackage" />
Cela indique à spring et à Hibernate où trouver vos classes de domaine annotées en tant qu'entités.
Il est possible que vous ayez oublié d'ajouter un mappage pour l'entité créée dans hibernate.cfg.xml
, même erreur.
J'importais aussi la mauvaise entité import org.hibernate.annotations.Entity;
Il devrait s'agir d'importer 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
J'avais la même erreur alors que Spring avec hibernate..J'ai utilisé "utilisateur" en minuscule dans mon instruction createQuery
et que ma classe était Utilisateur..Afin de la changer en Utilisateur dans ma requête et le problème a été résolu.
Requête avant:
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);
avec org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
, vous essayez de sélectionner dans la table users
. Mais vous annotez votre classe avec @Table( name = "Users" )
. Vous pouvez donc utiliser users
ou Users
.
Je recommande ce modèle:
@Entity(name = User.PERSISTANCE_NAME)
@Table(name = User.PERSISTANCE_NAME )
public class User {
static final String PERSISTANCE_NAME = "USER";
// Column definitions here
}
Vous devez entrer le même nom dans votre requête de sélection que votre entité ou classe (sensible à la casse). c'est-à-dire, sélectionnez l'utilisateur parmi className/Entity Name user;
Dans votre requête, vous devez utiliser le nom de la classe (utilisateur) et non le nom de la table (utilisateurs) Votre requête est donc "De l'utilisateur"