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?

97
demandé sur Gray 2012-03-31 13:13:55

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();
237
répondu Ken Chan 2018-08-20 20:34:37

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 .

21
répondu Kumaresan Perumal 2018-07-13 19:56:53

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;
12
répondu Iwan Satria 2014-04-17 03:28:39

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;
    }
}
8
répondu Fırat KÜÇÜK 2016-08-22 14:41:42

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

6
répondu Gray 2017-05-23 12:26:32

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.

5
répondu jrreid 2017-01-18 04:08:58

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)
5
répondu Rajkumar 2017-05-16 16:21:53

Il est possible que vous ayez oublié d'ajouter un mappage pour l'entité créée dans hibernate.cfg.xml, même erreur.

4
répondu Augustas 2015-04-24 18:31:41

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.

3
répondu Gherbi Hicham 2016-12-23 10:46:02

J'importais aussi la mauvaise entité import org.hibernate.annotations.Entity; Il devrait être import javax.persistence.Entity;

2
répondu Ratheesh K 2016-02-02 17:00:40

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

0
répondu Lakhan Sharma 2017-12-29 08:21:33

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);
0
répondu Himanshu Shukla 2018-09-12 06:02:25