Я пытаюсь получить список всех пользователей из таблицы «users» и получаю следующую ошибку:
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)
Это код, который я написал для добавления / получения пользователей:
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();
}
Добавление пользователей работает, но когда я использую функцию getUsers, я получаю эту ошибку.
Это мой файл конфигурации гибернации:
<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>
и это мой класс пользователя:
@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;
}
...
}
Есть идеи, почему я получаю эту ошибку?
Ответы:
В HQL, вы должны использовать имя класса Java и свойства имя отображенных
@Entity
вместо фактического имени таблицы и столбца, поэтому HQL должно быть:Обновление: чтобы быть более точным, вы должны использовать имя объекта, настроенное
@Entity
для ссылки на «таблицу», которая по умолчанию является неквалифицированным именем сопоставленного класса java, если вы не указали его явно.(PS есть
@javax.persistence.Entity
но нет@org.hibernate.annotations.Entity
)источник
Например: имя вашего класса компонента - UserDetails.
Вы не указываете имя своей таблицы в Db. вы даете имя класса bean .
источник
Просто чтобы поделиться своим открытием. Я все еще получаю ту же ошибку, даже если запрос был нацелен на правильное имя класса. Позже я понял, что импортирую класс Entity из неправильного пакета.
Проблема была решена после того, как я изменил строку импорта с:
в
источник
Добавлена
@TABLE(name = "TABLE_NAME")
аннотация и исправлено. Проверьте свои аннотации и файл hibernate.cfg.xml. Это образец файла сущности, который работает:источник
Возможно, вы забыли добавить сопоставление для созданного объекта с
hibernate.cfg.xml
той же ошибкой.источник
Это означает, что спящий режим не знает
User
сущность как «пользователей».В
@Table
аннотации устанавливается таблицу имя , чтобы быть «Пользователи» , но имя сущности по - прежнему называют в HQL «Пользователь».Чтобы изменить оба, вы должны установить имя объекта:
См. Мой ответ здесь для получения дополнительной информации: Ошибка отображения таблицы гибернации
источник
Также убедитесь, что в конфигурации вашего компонента гибернации установлено следующее свойство:
Это сообщает Spring и hibernate, где найти классы домена, аннотированные как объекты.
источник
Некоторые установки MySQL на базе Linux требуют учета регистра. Решение - применить
nativeQuery
.источник
Я также импортировал неправильную сущность.
import org.hibernate.annotations.Entity;
Она должна быть импортирована.javax.persistence.Entity;
источник
Также убедитесь, что вы добавили аннотированный класс, используя:
new Configuration().configure("configuration file path").addAnnotatedClass(User.class)
Я всегда терял время при добавлении новой таблицы в базу данных с помощью Hibernate.
источник
Я получал ту же ошибку, когда Spring с гибернацией ... Я использовал "user" в нижнем регистре в моем
createQuery
заявлении, а мой класс был User ... Поэтому изменил его на User в моем запросе, и проблема была решена.Запрос перед:
Запрос после:
источник
У меня возникла эта проблема, когда я заменил старую библиотеку hibernate-core на hibernate-core-5.2.12. Однако вся моя конфигурация была в порядке. И я исправил эту проблему, создав sessionfactory следующим образом:
Надеюсь, это кому-то поможет
источник
Я рекомендую этот шаблон:
источник
В вашем запросе вы должны использовать имя класса (пользователь), а не имя таблицы (пользователи), поэтому ваш запрос будет «от пользователя».
источник
Вы должны ввести то же имя в запросе выбора, что и ваша сущность или класс (с учетом регистра). т.е. выберите пользователя из className / Entity Name user;
источник
с
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
, вы пытаетесь выбрать изusers
таблицы. Но вы аннотируете свой класс с помощью@Table( name = "Users" )
. Так что либо используйтеusers
, либоUsers
.источник
Если вы используете конфигурацию xml, вам понадобится что-то вроде следующего в файле applicationContext.xml:
источник