Ошибка спящего режима - QuerySyntaxException: пользователи не отображаются [от пользователей] - PullRequest
113 голосов
/ 31 марта 2012

Я пытаюсь получить список всех пользователей из таблицы «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;
    }
    ...    
}

Есть идеи, почему я получаю эту ошибку?

Ответы [ 14 ]

273 голосов
/ 31 марта 2012

В HQL вы должны использовать имя класса java и имя свойства сопоставленного @Entity вместо фактического имени таблицы и имени столбца, поэтому HQL должен быть :

List<User> result = (List<User>) session.createQuery("from User").list();
25 голосов
/ 20 мая 2015

Например: ваше имя класса бобов UserDetails

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

Вы не даете имя своей таблицы в БД. вы даете классу имя боба .

12 голосов
/ 17 апреля 2014

Просто чтобы поделиться своими находками.Я все еще получал ту же ошибку, даже если запрос был нацелен на правильное имя класса.Позже я понял, что импортирую класс Entity из неправильного пакета.

Проблема была решена после изменения строки импорта с:

import org.hibernate.annotations.Entity;

на

import javax.persistence.Entity;
9 голосов
/ 14 августа 2014

Добавлена ​​@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;
    }
}
6 голосов
/ 16 мая 2017

Некоторые установки MySQL на базе Linux требуют учета регистра.Обходной путь - применить nativeQuery.

@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)
6 голосов
/ 20 июля 2016

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

6 голосов
/ 24 апреля 2015

Возможно, вы забыли добавить отображение для созданного объекта в hibernate.cfg.xml, та же ошибка.

5 голосов
/ 18 января 2017

Также убедитесь, что в вашей конфигурации bean-компонента Hibernate установлено следующее свойство:

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

Это сообщает Spring и Hibernate, где найти классы вашего домена, аннотированные как сущности.

3 голосов
/ 23 декабря 2016

Также убедитесь, что вы добавили аннотированный класс, используя:

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

Это всегда тратило мое время при добавлении новой таблицы в базу данных с использованием Hibernate.

2 голосов
/ 02 февраля 2016

Я также импортировал неправильную сущность import org.hibernate.annotations.Entity; Это должен быть импорт javax.persistence.Entity;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...