Ruhezustandsfehler – QuerySyntaxException: Benutzer sind nicht zugeordnet [from users]

Lesezeit: 6 Minuten

Benutzer-Avatar
Blau

Ich versuche, eine Liste aller Benutzer aus der Tabelle “Benutzer” abzurufen, und 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/abzurufen:

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, aber wenn ich die getUsers-Funktion verwende, erhalte ich diesen Fehler.

Dies ist meine Konfigurationsdatei für den Ruhezustand:

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

  • Bezogen auf: stackoverflow.com/questions/14446048/…

    – Grau

    20. Juli 2016 um 15:48 Uhr

Benutzer-Avatar
Ken Chan

In der HQL sollten Sie die verwenden Java-Klassenname und Name des Anwesens des abgebildeten @Entity Anstelle des tatsächlichen Tabellennamens und Spaltennamens sollte die HQL also lauten:

List<User> result = session.createQuery("from User", User.class).getResultList();

Update : Um genauer zu sein, sollten Sie den in konfigurierten Entitätsnamen verwenden @Entity um auf die “Tabelle” zu verweisen, die standardmäßig auf den nicht qualifizierten Namen der Zuordnung verweist Java-Klasse wenn Sie es nicht explizit setzen.

(PS Es ist @javax.persistence.Entity aber nicht @org.hibernate.annotations.Entity)

  • Also eigentlich ist dies sogar case sensitive. “vom Benutzer” würde also zu derselben Ausnahme führen

    – tObi

    11. Juli 2014 um 12:25 Uhr

  • Es ist ein Teil der Antwort, aber um den Fehler zu beheben, musste ich den vollständigen Objektpfad wie folgt verwenden: […].createQuery(“from gcv.metier.User as u where u.username= ?”)

    – Raffael

    2. Oktober 2015 um 0:13 Uhr

  • Ich musste auch den gesamten Pfad verwenden, vielleicht hat JPA ein Problem mit dem Wort “Benutzer”? Ich denke, es ist ein reserviertes Wort in einigen DB-Implementierungen. Tatsächlich trat dieses Problem nur bei mir auf, als ich diese db-Tabelle von umbenannte Benutzer zu der Nutzer (Teil der Behebung eines anderen Problems) davor war JPA in Ordnung.

    – Michael Coxon

    16. Juni 2018 um 22:08 Uhr


  • Können Sie bitte list() auf getResultList() aktualisieren, da ersteres veraltet ist?

    – Durja

    18. April 2019 um 9:31 Uhr

  • Ich schaff das: method createQuery in interface org.hibernate.SharedSessionContract cannot be applied to given types; [ERROR] required: java.lang.String. Es mag nicht MyObject.class.

    – Merkur

    26. April um 5:45 Uhr


Benutzer-Avatar
Kumaresan Perumal

Zum Beispiel: Ihr Bean-Klassenname ist Nutzerdetails

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

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

Nur um meine Entdeckung zu teilen. Ich habe immer noch den gleichen Fehler erhalten, selbst wenn die Abfrage auf den richtigen Klassennamen abzielte. Später stellte ich fest, dass ich die Entity-Klasse aus dem falschen Paket importierte.

Das Problem wurde gelöst, nachdem ich die Importzeile geändert habe von:

import org.hibernate.annotations.Entity;

zu

import javax.persistence.Entity;

  • Das hat mich jetzt tatsächlich gerettet.

    – Anirudh

    15. April 2019 um 16:02 Uhr

Benutzer-Avatar
Fırat KÜÇÜK

Hinzugefügt @TABLE(name = "TABLE_NAME") Anmerkung und behoben. Überprüfen Sie Ihre Anmerkungen und die Datei hibernate.cfg.xml. Dies ist die Beispiel-Entity-Datei, 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;
    }
}

Benutzer-Avatar
Grau

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]

Dies deutet darauf hin, dass Hibernate das nicht kennt User Entität als “Benutzer”.

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

Das @Table Anmerkung setzt die Tisch Name zu “Benutzer”, aber der Entitätsname wird in HQL immer noch als “Benutzer” bezeichnet.

Um beides zu ändern, sollten 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{

Weitere Informationen finden Sie in meiner Antwort hier: Hibernate-Tabelle nicht zugeordneter Fehler

Benutzer-Avatar
Augustas

Es besteht die Möglichkeit, dass Sie vergessen haben, eine Zuordnung für die erstellte Entität hinzuzufügen hibernate.cfg.xmlgleicher Fehler.

Benutzer-Avatar
Paul Roub

Bei einigen Linux-basierten MySQL-Installationen muss zwischen Groß- und Kleinschreibung unterschieden werden. Workaround ist anzuwenden nativeQuery.

@Query(value="select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID", nativeQuery = true)

  • Sind Sie sicher, dass “Linux-basiertes MySQL” hier eine Rolle spielt?

    – asg

    23. November 2017 um 20:32 Uhr

1343770cookie-checkRuhezustandsfehler – QuerySyntaxException: Benutzer sind nicht zugeordnet [from users]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy