Ответ 1
В HQL вы должны использовать имя класса java и имя свойства сопоставленного @Entity
вместо фактического имени таблицы и имени столбца, поэтому HQL должен быть:
List<User> result = (List<User>) session.createQuery("from User").list();
Я пытаюсь получить список всех пользователей из таблицы "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>
и это мой класс User:
@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 должен быть:
List<User> result = (List<User>) session.createQuery("from User").list();
Например: имя вашего бобового класса - UserDetails
Query query = entityManager. createQuery("Select UserName from **UserDetails** ");
Вы не даете имя вашей таблицы на Db. вы даете классу имя боба.
Просто чтобы поделиться своим нахождением. Я по-прежнему получал такую же ошибку, даже если запрос был нацелен на правильное имя класса. Позже я понял, что я импортировал класс Entity из неправильного пакета.
Проблема была решена после изменения строки импорта:
import org.hibernate.annotations.Entity;
to
import javax.persistence.Entity;
Добавлена аннотация @TABLE(name = "TABLE_NAME")
и исправлена. Проверьте свои аннотации и файл hibernate.cfg.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;
}
}
Есть возможность забыть добавить отображение для созданного Entity в hibernate.cfg.xml
, ту же ошибку.
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 {
Аннотация @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, где можно найти классы домена, аннотированные как сущности.
Некоторые Linux-установки на основе Linux требуют чувствительности к регистру. Обход - это применить nativeQuery
.
@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)
Также проверьте, что вы добавили аннотированный класс, используя:
new Configuration().configure("configuration file path").addAnnotatedClass(User.class)
Это всегда теряло мое время при добавлении новой таблицы в базу данных с помощью Hibernate.
Я также импортировал неправильный Entity import org.hibernate.annotations.Entity;
Это должен быть импорт javax.persistence.Entity;
Я получил эту проблему, когда я заменил старую библиотеку hibernate-core на hibernate-core-5.2.12. Однако все мои настройки были в порядке. И я исправил эту проблему, создав сессионный завод следующим образом:
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);
}
}
Надеюсь, это поможет кому-то
Я получал ту же ошибку, когда Spring с hibernate.. Я использовал "user" в нижнем регистре в моем createQuery
и мой класс был User..So изменил его на User в моем запросе, и проблема была решена.
Запрос перед:
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);
Я рекомендую этот шаблон:
@Entity(name = User.PERSISTANCE_NAME)
@Table(name = User.PERSISTANCE_NAME )
public class User {
static final String PERSISTANCE_NAME = "USER";
// Column definitions here
}
В вашем запросе вы должны использовать имя класса (пользователь), а не имя таблицы (пользователи), поэтому ваш запрос "от пользователя"
Вы должны ввести то же имя в запросе выбора, что и ваша сущность или класс (с учетом регистра). то есть выберите пользователя из className/Entity Name user;
с помощью org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
вы пытаетесь выбрать из таблицы users
. Но вы аннотируете свой класс с помощью @Table( name = "Users" )
. Поэтому либо используйте users
, либо Users
.