Kesalahan hibernasi - QuerySyntaxException: pengguna tidak dipetakan [dari pengguna]


126

Saya mencoba untuk mendapatkan daftar semua pengguna dari tabel "pengguna" dan saya mendapatkan kesalahan berikut:

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)

Ini adalah kode yang saya tulis untuk menambah / mendapatkan pengguna:

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

Menambahkan pengguna berfungsi, tetapi ketika saya menggunakan fungsi getUsers saya mendapatkan kesalahan ini.

Ini adalah file konfigurasi hibernate saya:

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

dan ini adalah kelas Pengguna saya:

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

Adakah yang tahu mengapa saya mendapatkan kesalahan ini?


Jawaban:


297

Di HQL, Anda harus menggunakan nama kelas java dan nama properti yang dipetakan @Entityalih-alih nama tabel dan nama kolom yang sebenarnya, jadi HQL seharusnya:

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

Pembaruan: Untuk lebih tepatnya, Anda harus menggunakan nama entitas yang dikonfigurasikan @Entityuntuk merujuk ke "tabel", yang standarnya adalah nama yang tidak memenuhi syarat dari kelas java yang dipetakan jika Anda tidak menetapkannya secara eksplisit.

(PS Itu @javax.persistence.Entitytapi tidak @org.hibernate.annotations.Entity)


10
Jadi sebenarnya ini bahkan case sensitif. jadi "dari pengguna" akan menghasilkan pengecualian yang sama
tObi

3
Ini bagian dari jawabannya, tetapi untuk menyelesaikan kesalahan saya harus menggunakan path objek lengkap seperti ini: [...]. CreateQuery ("from gcv.metier.User as u where u.username =?")
Raphael

Saya juga harus menggunakan seluruh jalur, mungkin JPA memiliki masalah dengan kata "Pengguna"? Saya kira itu adalah kata yang disediakan dalam beberapa implementasi DB. Bahkan, masalah ini hanya muncul dari saya ketika saya mengganti nama tabel db dari pengguna ke the_user (bagian dari memperbaiki masalah lain) sebelum JPA baik-baik saja.
Michael Coxon

1
dapatkah Anda memperbarui daftar () ke getResultList () karena yang sebelumnya sudah usang?
Durja Arai

31

Misalnya: nama kelas kacang Anda adalah UserDetails

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

Anda tidak memberikan nama tabel Anda pada Db. Anda memberi nama kelas kacang .


12

Hanya untuk membagikan temuan saya. Saya masih mendapatkan kesalahan yang sama bahkan jika kueri menargetkan nama kelas yang benar. Kemudian saya menyadari bahwa saya mengimpor kelas Entity dari paket yang salah.

Masalah terpecahkan setelah saya mengubah jalur impor dari:

import org.hibernate.annotations.Entity;

untuk

import javax.persistence.Entity;

Sekarang ini benar-benar menyelamatkan saya.
Anirudh

9

Menambahkan @TABLE(name = "TABLE_NAME")anotasi dan memperbaiki. Periksa anotasi dan file hibernate.cfg.xml Anda. Ini adalah contoh file entitas yang berfungsi:

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

Ada kemungkinan Anda lupa menambahkan pemetaan untuk Entity yang dibuat ke dalam hibernate.cfg.xml, kesalahan yang sama.


Saya juga lupa menambahkan kelas POJO di hibernate.cfg.xml.
Chinmoy

6

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

Ini menunjukkan bahwa hibernate tidak mengetahui Userentitas sebagai "pengguna".

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

The @Tablepenjelasan menetapkan tabel nama menjadi "Pengguna" tetapi nama entitas masih dimaksud dalam HQL sebagai "User".

Untuk mengubah keduanya, Anda harus menetapkan nama entitas:

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

Lihat jawaban saya di sini untuk info lebih lanjut: Tabel Hibernate tidak memetakan kesalahan


5

Juga pastikan bahwa properti berikut diatur dalam konfigurasi kacang hibernasi Anda:

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

Ini memberi tahu pegas dan hibernasi tempat menemukan kelas domain Anda beranotasi sebagai entitas.


5

Beberapa instalasi MySQL berbasis Linux memerlukan case sensitif. Bekerja di sekitar adalah untuk melamar nativeQuery.

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

1
Anda yakin "MySQL berbasis Linux" memiliki peran di sini?
asgs

3

Saya juga mengimpor Entitas yang salah. import org.hibernate.annotations.Entity; Seharusnya imporjavax.persistence.Entity;


3

Juga periksa apakah Anda menambahkan kelas beranotasi menggunakan:

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

Itu selalu membuang waktu saya ketika menambahkan tabel baru dalam database menggunakan Hibernate.


2

Saya mendapatkan kesalahan yang sama saat Spring dengan hibernate..Saya menggunakan "pengguna" dalam huruf kecil di createQuery pernyataan saya dan kelas saya adalah Pengguna..Jadi ubahlah ke Pengguna dalam kueri saya dan masalah terpecahkan.

Pertanyaan sebelum:

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

Permintaan setelah:

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

1

Saya mendapatkan masalah ini ketika saya mengganti pustaka hibernate-core lama dengan hibernate-core-5.2.12. Namun semua konfigurasi saya baik-baik saja. Dan saya memperbaiki masalah ini dengan membuat sessionfactory dengan cara ini:

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

    }
}

Semoga ini bisa membantu seseorang


1

Saya merekomendasikan pola ini:

@Entity(name = User.PERSISTANCE_NAME)
@Table(name = User.PERSISTANCE_NAME )
public class User {    
    static final String PERSISTANCE_NAME = "USER";

    // Column definitions here

}

0

Di Kueri Anda, Anda harus menggunakan nama kelas (Pengguna) bukan nama tabel (pengguna) sehingga permintaan Anda adalah "dari Pengguna"


0

Anda harus mengetikkan nama yang sama dalam kueri pemilihan Anda sebagai entitas atau kelas Anda (peka huruf besar kecil). yaitu memilih pengguna dari pengguna className / Nama Entitas;


0

dengan org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users], Anda mencoba untuk memilih dari userstabel. Tapi kamu membuat catatan dengan kelasmu @Table( name = "Users" ). Jadi gunakan users, atau Users.


0

Jika Anda menggunakan konfigurasi xml, Anda akan memerlukan sesuatu seperti berikut ini di file applicationContext.xml:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" lazy-init="default" autowire="default" dependency-check="default">
<property name="dataSource">
  <ref bean="dataSource" />
</property>
<property name="annotatedClasses">
  <list>
    <value>org.browsexml.timesheetjob.model.PositionCode</value>
  </list>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.