it-swarm.com.de

Fehler im Ruhezustand - QuerySyntaxException: Benutzer werden nicht [von Benutzern] zugeordnet.

Ich versuche, eine Liste aller Benutzer aus der Tabelle "Benutzer" abzurufen, und ich erhalte die folgende Fehlermeldung:

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)

Dies ist der Code, den ich geschrieben habe, um Benutzer hinzuzufügen/zu erhalten:

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();
}

Das Hinzufügen von Benutzern funktioniert zwar, aber wenn ich die getUsers-Funktion verwende, erhalte ich diese Fehlermeldung.

Dies ist meine Hibernate-Konfigurationsdatei:

<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>

und das ist meine Benutzerklasse:

@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;
    }
    ...    
}

Irgendeine Idee, warum ich diesen Fehler bekomme?

106
Blue

In der HQL sollten Sie den Java-Klassennamen und Eigenschaftsname des zugeordneten @Entity anstelle des tatsächlichen Tabellennamens und des Spaltennamens verwenden.

List<User> result = (List<User>) session.createQuery("from User").list();
254
Ken Chan

Zum Beispiel: Ihr Bean-Klassenname lautet UserDetails

Query query = entityManager. createQuery("Select UserName from **UserDetails** "); 

Sie geben Ihren Tabellennamen nicht auf der Datenbank an. Sie geben den Klassennamen von Bean an.

23

Nur um meine Erkenntnis zu teilen. Ich habe immer noch dieselbe Fehlermeldung erhalten, auch wenn die Abfrage auf den richtigen Klassennamen ausgerichtet war. Später erkannte ich, dass ich die Entity-Klasse aus dem falschen Paket importierte.

Das Problem wurde behoben, nachdem ich die Importlinie geändert habe:

import org.hibernate.annotations.Entity;

zu 

import javax.persistence.Entity;
11
Iwan Satria

@TABLE(name = "TABLE_NAME")-Anmerkung hinzugefügt und behoben. Überprüfen Sie Ihre Anmerkungen und die Datei hibernate.cfg.xml. Dies ist die Beispiel-Entitätsdatei, die funktioniert:

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

Bei einigen Linux-basierten MySQL-Installationen ist die Groß- und Kleinschreibung zu beachten. Umgehen ist das Anwenden von 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]

Dies bedeutet, dass der Ruhezustand die User-Entität nicht als "Benutzer" kennt.

@javax.persistence.Entity
@javax.persistence.Table(name = "Users")
public class User {

Die @Table-Annotation legt den table - Namen auf "Benutzer" fest, der Entity-Name wird jedoch weiterhin in HQL als "Benutzer" bezeichnet.

Um beide zu ändern, müssen Sie den Namen der Entität festlegen:

// this sets the name of the table and the name of the entity
@javax.persistence.Entity(name = "Users")
public class User implements Serializable{

Siehe meine Antwort hier für weitere Informationen: Nicht zugeordneter Fehler in Hibernate-Tabelle

6
Gray

Stellen Sie außerdem sicher, dass die folgende Eigenschaft in Ihrer Hibernate-Bean-Konfiguration festgelegt ist: 

<property name="packagesToScan" value="yourpackage" />

Dies gibt Spring und Hibernate an, wo Sie Ihre als Entitäten kommentierten Domänenklassen finden können. 

5
jrreid

Es besteht die Möglichkeit, dass Sie vergessen haben, Mapping für die erstellte Entität in hibernate.cfg.xml hinzuzufügen.

4
Augustas

Überprüfen Sie auch, ob Sie die mit Anmerkungen versehene Klasse hinzugefügt haben, indem Sie Folgendes verwenden:

new Configuration().configure("configuration file path").addAnnotatedClass(User.class)

Das hat immer meine Zeit verschwendet, wenn ich mit Hibernate eine neue Tabelle in die Datenbank aufgenommen habe.

3
Gherbi Hicham

Ich habe auch die falsche Entität import org.hibernate.annotations.Entity; importiert. Es sollte import javax.persistence.Entity; sein.

2
Ratheesh K

Ich habe dieses Problem bekommen, als ich die alte Hibernate-Core-Bibliothek durch Hibernate-Core-5.2.12 ersetzt habe. Meine Konfiguration war jedoch in Ordnung. Und ich habe dieses Problem behoben, indem ich sessionfactory folgendermaßen erstellt habe:

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);

    }
}

Hoffe es hilft jemandem

1
Lakhan Sharma

Ich habe die gleiche Fehlermeldung erhalten, während Spring mit hibernate..mit "user" in meiner createQuery-Anweisung in Kleinbuchstaben verwendet wurde. Meine Klasse war User..So änderte es in User in meiner Abfrage und das Problem wurde gelöst.

Abfrage vor:

Query query= em.createQuery("select u from user u where u.username=:usr AND u.password=:pass",User.class);

Abfrage nach:

Query query= em.createQuery("select u from User u where u.username=:usr AND u.password=:pass",User.class);
1
Himanshu Shukla

mit org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users] versuchen Sie, aus der Tabelle users auszuwählen. Aber Sie kommentieren Ihre Klasse mit @Table( name = "Users" ). Verwenden Sie also entweder users oder Users.

0
zak zak

Ich empfehle dieses Muster:

@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

Sie müssen in Ihre Auswahlabfrage denselben Namen wie Ihre Entität oder Klasse eingeben (Groß- und Kleinschreibung beachten). d. h. Benutzer aus className/Entity Name-Benutzer auswählen;

0
Vipul Thakur

In Ihrer Abfrage müssen Sie den Klassennamen (Benutzer) und nicht den Tabellennamen (Benutzer) Verwenden.

0
sami gharbi