web-dev-qa-db-fra.com

Erreur Hibernate - QuerySyntaxException: les utilisateurs ne sont pas mappés [des utilisateurs]

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?

106
Blue

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();
254
Ken Chan

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 .

23

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;
11
Iwan Satria

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;
    }
}
9
Fırat KÜÇÜK

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)
6
Rajkumar

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

6
Gray

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. 

5
jrreid

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

4
Augustas

J'importais aussi la mauvaise entité import org.hibernate.annotations.Entity;Il devrait s'agir d'importer javax.persistence.Entity;

2
Ratheesh K

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

1
Lakhan Sharma

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);
1
Himanshu Shukla

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.

0
zak zak

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

}
0
Jonas Gröger

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;

0
Vipul Thakur

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"

0
sami gharbi