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:
Di HQL, Anda harus menggunakan nama kelas java dan nama properti yang dipetakan
@Entity
alih-alih nama tabel dan nama kolom yang sebenarnya, jadi HQL seharusnya:Pembaruan: Untuk lebih tepatnya, Anda harus menggunakan nama entitas yang dikonfigurasikan
@Entity
untuk 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.Entity
tapi tidak@org.hibernate.annotations.Entity
)sumber
Misalnya: nama kelas kacang Anda adalah UserDetails
Anda tidak memberikan nama tabel Anda pada Db. Anda memberi nama kelas kacang .
sumber
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:
untuk
sumber
Menambahkan
@TABLE(name = "TABLE_NAME")
anotasi dan memperbaiki. Periksa anotasi dan file hibernate.cfg.xml Anda. Ini adalah contoh file entitas yang berfungsi:sumber
Ada kemungkinan Anda lupa menambahkan pemetaan untuk Entity yang dibuat ke dalam
hibernate.cfg.xml
, kesalahan yang sama.sumber
Ini menunjukkan bahwa hibernate tidak mengetahui
User
entitas sebagai "pengguna".The
@Table
penjelasan menetapkan tabel nama menjadi "Pengguna" tetapi nama entitas masih dimaksud dalam HQL sebagai "User".Untuk mengubah keduanya, Anda harus menetapkan nama entitas:
Lihat jawaban saya di sini untuk info lebih lanjut: Tabel Hibernate tidak memetakan kesalahan
sumber
Juga pastikan bahwa properti berikut diatur dalam konfigurasi kacang hibernasi Anda:
Ini memberi tahu pegas dan hibernasi tempat menemukan kelas domain Anda beranotasi sebagai entitas.
sumber
Beberapa instalasi MySQL berbasis Linux memerlukan case sensitif. Bekerja di sekitar adalah untuk melamar
nativeQuery
.sumber
Saya juga mengimpor Entitas yang salah.
import org.hibernate.annotations.Entity;
Seharusnya imporjavax.persistence.Entity;
sumber
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.
sumber
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:
Permintaan setelah:
sumber
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:
Semoga ini bisa membantu seseorang
sumber
Saya merekomendasikan pola ini:
sumber
Di Kueri Anda, Anda harus menggunakan nama kelas (Pengguna) bukan nama tabel (pengguna) sehingga permintaan Anda adalah "dari Pengguna"
sumber
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;
sumber
dengan
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
, Anda mencoba untuk memilih dariusers
tabel. Tapi kamu membuat catatan dengan kelasmu@Table( name = "Users" )
. Jadi gunakanusers
, atauUsers
.sumber
Jika Anda menggunakan konfigurasi xml, Anda akan memerlukan sesuatu seperti berikut ini di file applicationContext.xml:
sumber