최대 절전 모드 오류-QuerySyntaxException : 사용자가 [사용자로부터] 맵핑되지 않았습니다.


126

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

이 오류가 발생하는 이유는 무엇입니까?


답변:


297

HQL 에서 실제 테이블 이름 및 열 이름 대신 맵핑 된 Java 클래스 이름특성 이름@Entity사용해야하므로 HQL은 다음과 같아야합니다.

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

보다 정확한 설명 @Entity을 위해, "table"을 참조 하도록 구성된 엔티티 이름을 사용해야합니다 . 명시 적으로 설정하지 않으면 매핑 된 Java 클래스 의 규정되지 않은 이름이 기본값 으로 사용됩니다.

(PS 그것은 @javax.persistence.Entity아니지만 @org.hibernate.annotations.Entity)


10
실제로 이것은 대소 문자를 구분합니다. 따라서 "사용자로부터"는 동일한 예외가 발생합니다
tObi

3
대답의 일부이지만 오류를 해결하려면 다음과 같은 전체 객체 경로를 사용해야했습니다. [...]. createQuery ( "gcv.metier.User from u as u.username =?")
Raphael

또한 전체 경로를 사용해야했을 것입니다. JPA에 "User"라는 단어에 문제가 있습니까? 나는 그것이 몇 가지 DB 구현에서 예약어라고 생각합니다. 실제로이 문제는 JPA가 양호하기 전에 해당 db 테이블의 이름을 user 에서 the_user (다른 문제 수정의 일부) 로 바꿀 때만 발생했습니다.
Michael Coxon

1
전자가 더 이상 사용되지 않으므로 list ()를 getResultList ()로 업데이트 할 수 있습니까?
Durja Arai

31

예를 들어, Bean 클래스 이름은 UserDetails입니다.

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

Db에 테이블 이름을 지정하지 마십시오. bean의 클래스 이름을 제공합니다 .


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

생성 된 엔터티에 대한 매핑을 hibernate.cfg.xml같은 오류 에 추가하지 않았을 수 있습니다 .


나도 hibernate.cfg.xml에 POJO 클래스를 추가하는 것을 잊었다.
Chinmoy

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

또한 최대 절전 모드 Bean 구성에 다음 특성이 설정되어 있는지 확인하십시오.

<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"이 여기서 중요한 역할을합니까?
ass

3

또한 잘못된 법인 수입되었다 import org.hibernate.annotations.Entity; 그것은 수입해야한다javax.persistence.Entity;


3

또한 다음을 사용하여 주석이 달린 클래스를 추가했는지 확인하십시오.

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

Hibernate를 사용하여 데이터베이스에 새 테이블을 추가 할 때 항상 내 시간을 낭비했습니다.


2

나는 최대 절전 모드가있는 Spring 동안 동일한 오류가 발생 createQuery했습니다.

전에 쿼리 :

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

오래된 최대 절전 모드 라이브러리를 최대 절전 모드 코어 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);

    }
}

누군가에게 도움이되기를 바랍니다.


1

이 패턴을 추천합니다 :

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

    // Column definitions here

}

0

쿼리에서 테이블 이름 (사용자)이 아닌 클래스 이름 (사용자)을 사용해야하므로 쿼리가 "사용자로부터"


0

선택 쿼리에서 엔티티 또는 클래스 (대소 문자 구분)와 동일한 이름을 입력해야합니다. 즉, className / Entity Name 사용자로부터 사용자를 선택하십시오.


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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.