Помилка в сплячому режимі - QuerySyntaxException: користувачі не відображаються [від користувачів]


126

Я намагаюся отримати список усіх користувачів із таблиці "користувачів", і я отримую таку помилку:

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;
    }
    ...    
}

Будь-яка ідея, чому я отримую цю помилку?


Відповіді:


297

У HQL слід використовувати ім’я класу java та ім’я властивості відображеного @Entityзамість фактичного імені таблиці та імені стовпця, тому HQL повинен бути:

List<User> result = session.createQuery("from User", User.class).getResultList();

Оновлення: Якщо точніше, ви повинні використовувати ім'я сутності, налаштоване @Entityдля позначення "таблиці", за замовчуванням якої є некваліфіковане ім'я відображеного java-класу, якщо ви не встановите це явно.

(PS Це так, @javax.persistence.Entityале ні @org.hibernate.annotations.Entity)


10
Тож насправді це враховує навіть регістри. тому "від користувача" призведе до того ж винятку
tObi

3
Це частина відповіді, але для вирішення помилки мені довелося використати повний шлях до об'єкта таким чином: [...]. CreateQuery ("від gcv.metier.User як і де u.username =?")
Рафаель

Я також повинен був використовувати весь шлях, можливо, у JPA є проблема зі словом "Користувач"? Я думаю, що це зарезервоване слово в кількох реалізаціях БД. Насправді ця проблема виникла у мене лише тоді, коли я перейменував цю таблицю DB від користувача до the_user (частина виправлення іншої проблеми) до того, як JPA була в порядку.
Майкл Коксон

1
чи можете ви pls оновити список () для getResultList (), оскільки попередній застарілий?
Durja Arai

31

Наприклад: ваше ім'я класу bean - UserDetails

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

Ви не даєте імені своєї таблиці на Db. ви даєте класу ім'я квасолі .


12

Просто поділитися своїми висновками. Я все одно отримав ту саму помилку, навіть якщо запит орієнтувався на правильну назву класу. Пізніше я зрозумів, що імпортую клас Entity з неправильного пакета.

Проблема була вирішена, коли я змінив імпортну лінію з:

import org.hibernate.annotations.Entity;

до

import javax.persistence.Entity;

Тепер це фактично мене врятувало.
Anirudh

9

Додано @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;
    }
}

8

Є можливість ви забули додати відображення створеного Entity у hibernate.cfg.xmlту саму помилку.


Я теж забув додати клас POJO в hibernate.cfg.xml.
Чінмой

6

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]

Це вказує на те, що сплячий не знає 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{

Дивіться мою відповідь тут для отримання додаткової інформації: Зимова сплячка не відображена помилка


5

Також переконайтеся, що в конфігурації фасолі зірки встановлено наступне властивість:

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

Це повідомляє про весну та сплячку, де можна знайти ваші доменні класи, позначені як сутності.


5

Деякі установки на базі Linux MySQL потребують урахування регістру. Подолати рішення - застосувати nativeQuery.

@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)

1
Ви впевнені, що "MySQL на базі Linux" має тут роль?
асг

3

Я також імпортував неправильну сутність. import org.hibernate.annotations.Entity; Це має бути імпортjavax.persistence.Entity;


3

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

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

Це завжди витрачало мій час, коли додавали нову таблицю в базу даних за допомогою Hibernate.


2

Я отримував таку ж помилку, коли Spring із сплячим createQueryрежимом .. Я використовував "user" у нижньому регістрі мого висловлювання, і в моєму класі був 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);

1

Цю проблему я отримав, коли я замінив стару бібліотеку зі сплячого сну на 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);

    }
}

Сподіваюся, це комусь допоможе


1

Я рекомендую цю схему:

@Entity(name = User.PERSISTANCE_NAME)
@Table(name = User.PERSISTANCE_NAME )
public class User {    
    static final String PERSISTANCE_NAME = "USER";

    // Column definitions here

}

0

У Вашому Запиті ви повинні використовувати ім'я класу (User), а не ім'я таблиці (користувачів), тому ваш запит "від користувача"


0

У запиті вибору потрібно ввести те саме ім’я, що і ваша сутність або клас (залежно від регістру). тобто виберіть користувача з className / Entity Name user;


0

з org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users], ви намагаєтесь вибрати з usersтаблиці. Але ви коментуєте свій клас @Table( name = "Users" ). Тож або використовуйте users, або Users.


0

Якщо ви використовуєте конфігурацію xml, вам знадобиться щось подібне у файлі applicationContext.xml:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" lazy-init="default" autowire="default" dependency-check="default">
<property name="dataSource">
  <ref bean="dataSource" />
</property>
<property name="annotatedClasses">
  <list>
    <value>org.browsexml.timesheetjob.model.PositionCode</value>
  </list>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.