Ошибка гибернации - QuerySyntaxException: пользователям не сопоставлены [от пользователей]
Я пытаюсь получить список всех пользователей из таблицы "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:
<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;
}
...
}
есть идеи, почему я получаю эту ошибку?
12 ответов:
в HQL, вы должны использовать имя класса java и название объекта на карте
@Entityвместо фактического имени таблицы и имени столбца, поэтому HQL должен быть:List<User> result = (List<User>) session.createQuery("from User").list();
например: имя вашего класса bean -UserDetails
Query query = entityManager. createQuery("Select UserName from **UserDetails** ");вы не даете имя таблицы в БД. вы даете имя класса bean.
просто поделиться своим открытием. Я все равно получил ту же ошибку, даже если запрос был нацелен на правильное имя класса. Позже я понял, что импортировал класс сущности из неправильного пакета.
проблема была решена после того, как я изменить импорта из:
import org.hibernate.annotations.Entity;до
import javax.persistence.Entity;
добавил
@TABLE(name = "TABLE_NAME")аннотация и исправлено. Проверьте свои аннотации и спящий режим.контекстно-свободная грамматика.XML-файл. Это пример файла сущности, который работает: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; } }
org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]это означает, что hibernate не знает
Userорганизация как "пользователи".@javax.persistence.Entity @javax.persistence.Table(name = "Users") public class User {The
@Tableаннотация устанавливает стол имя должно быть "пользователи", но имя сущности по-прежнему упоминается в HQL как"пользователь".чтобы изменить оба, вы должны установить имя сущности:
// this sets the name of the table and the name of the entity @javax.persistence.Entity(name = "Users") public class User implements Serializable{смотрите мой ответ здесь для получения дополнительной информации: Hibernate таблица не отображается ошибка
также убедитесь, что в конфигурации Hibernate bean установлено следующее свойство:
<property name="packagesToScan" value="yourpackage" />это говорит spring и hibernate, где найти ваши доменные классы, аннотированные как сущности.
некоторые установки MySQL на базе Linux требуют учета регистра. Работа вокруг заключается в применении
nativeQuery.@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)
есть возможность, что вы забыли добавить отображение для созданного объекта в
hibernate.cfg.xml, та же ошибка.
также проверьте, что вы добавили аннотированный класс с помощью:
new Configuration().configure("configuration file path").addAnnotatedClass(User.class)это всегда тратило мое время при добавлении новой таблицы в базу данных с помощью Hibernate.
Я также импортировал неправильный объект
import org.hibernate.annotations.Entity;Это должен быть importjavax.persistence.Entity;
У меня есть эта проблема, когда я заменил старый спящий режим-основной библиотеки с Hibernate-ядро-5.2.12. Однако все мои настройки были в порядке. И я исправил эту проблему, создав sessionfactory таким образом:
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); } }надеюсь, что это поможет кому-то
я получал ту же ошибку во время весны с гибернацией..Я использовал "пользователь" в нижнем регистре в моем
createQueryзаявление и мой класс был User..So изменил его на пользователя в моем запросе и проблема была решена.запрос до:
Query query= em.createQuery("select u from user u where u.username=:usr AND u.password=:pass",User.class);запрос после:
Query query= em.createQuery("select u from User u where u.username=:usr AND u.password=:pass",User.class);
Comments