복붙노트

[SPRING] HQL 쿼리에서 Hibernate 테이블 매핑 오류가 발생했습니다.

SPRING

HQL 쿼리에서 Hibernate 테이블 매핑 오류가 발생했습니다.

데이터베이스를 통해 CRUD 연산을 만들기 위해 Hibernate를 사용하는 웹 애플리케이션이있다. 테이블이 매핑되지 않았다는 오류가 나타납니다. 자바 파일보기 :

에러 메시지:

org.springframework.orm.hibernate3.HibernateQueryException: Books is not mapped [SELECT COUNT(*) FROM Books]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:660)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
...
Caused by: org.hibernate.hql.ast.QuerySyntaxException: Books is not mapped [SELECT COUNT(*) FROM Books]
at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181)
at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:111)
at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)
...

내 DAO.java 메서드는 다음과 같습니다.

public int getTotalBooks(){
    return DataAccessUtils.intResult(hibernateTemplate.find(
          "SELECT COUNT(*) FROM Books"));
}

Book.java:

@Entity
@Table(name="Books")
public class Book {

    @Id
    @GeneratedValue
    @Column(name="id")
    private int id;

    @Column(name="title", nullable=false)
    private String title;
    ...
}

작동하려면 어떻게 수정해야합니까?

해결법

  1. ==============================

    1.예외 메시지는 무엇을 말합니까? 그것은 말한다 :

    예외 메시지는 무엇을 말합니까? 그것은 말한다 :

    그게 당신에게 무엇을 말합니까? 도서가 매핑되지 않았다는 것을 알려줍니다. 즉, Books라고하는 매핑 된 유형이 없다는 것입니다.

    실제로, 그렇지 않습니다. 매핑 된 유형을 도서라고합니다. Books라는 표에 매핑되지만 책의 유형은 Book입니다. HQL (또는 JPQL) 쿼리를 작성할 때 테이블이 아닌 유형의 이름을 사용합니다.

    따라서 검색어를 다음과 같이 변경하십시오.

    나는 그것이 필요하다고 생각하지만

    HQL이 * 표기법을 지원하지 않는 경우.

    예외 메시지를 읽음으로써 많은 것을 배울 수 있습니다!

  2. ==============================

    2.Hibernate는 "Books"라는 엔티티를 알지 못한다고 말하고있다. 엔티티를 살펴 보겠습니다.

    Hibernate는 "Books"라는 엔티티를 알지 못한다고 말하고있다. 엔티티를 살펴 보겠습니다.

    @javax.persistence.Entity
    @javax.persistence.Table(name = "Books")
    public class Book {
    

    권리. Book의 테이블 이름은 "Books"로 이름이 변경되었지만 엔티티 이름은 여전히 ​​클래스 이름의 "Book"입니다. 엔티티 이름을 설정하려면 @Entity 주석의 이름을 사용해야합니다.

    // this allows you to use the entity Books in HQL queries
    @javax.persistence.Entity(name = "Books")
    public class Book {
    

    엔티티 이름과 테이블 이름이 모두 설정됩니다.

    필자는 Person.hbm.xml 파일에서 Java 주석을 사용하여 최대 절전 모드 필드를 설명 할 때 반대 문제가 발생했습니다. 내 오래된 XML 파일은 다음과 같습니다.

    <hibernate-mapping package="...">
        <class name="Person" table="persons" lazy="true">
           ...
    </hibernate-mapping>
    

    그리고 새 엔터티에는 @Entity (name = ...)가있어서 테이블의 이름을 설정해야했습니다.

    // this renames the entity and sets the table name
    @javax.persistence.Entity(name = "persons")
    public class Person {
        ...
    

    그럼 내가 봤던 것은 HQL 오류들이다.

    QuerySyntaxException: Person is not mapped
         [SELECT id FROM Person WHERE id in (:ids)]
    

    이것에 대한 문제는 개체 이름이 사람에게도 이름이 변경되고 있다는 것이 었습니다. 테이블 이름을 다음과 같이 설정해야합니다.

    // no name = here so the entity can be used as Person
    @javax.persistence.Entity
    // table name specified here
    @javax.persistence.Table(name = "persons")
    public class Person extends BaseGeneratedId {
    

    희망이 다른 사람들을 돕는다.

  3. ==============================

    3.모든 분에게 감사합니다. 좋은 아이디어 많이. 이것은 Spring과 Hibernate에서의 첫 번째 어플리케이션입니다 .. 나 같은 "초보자"를 다룰 때 좀 더 인내하십시오.

    모든 분에게 감사합니다. 좋은 아이디어 많이. 이것은 Spring과 Hibernate에서의 첫 번째 어플리케이션입니다 .. 나 같은 "초보자"를 다룰 때 좀 더 인내하십시오.

    Tom Anderson과 Roman C.의 대답을 읽어주십시오. 그들은 문제를 아주 잘 설명했다. 모두들 나를 도왔습니다.

    SELECT COUNT(*) FROM Books
    

    select count(book.id) from Book book
    

    그리고 물론, 나는이 Spring 설정을 가지고있다 :

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="packagesToScan" value="extjs.model"/>
    

    다시 한번 감사드립니다!

  4. ==============================

    4.Spring 구성에서 sessionFactory가이 속성을 넣은 applicationContext.xml을 입력하십시오.

    Spring 구성에서 sessionFactory가이 속성을 넣은 applicationContext.xml을 입력하십시오.

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
      <property name="packagesToScan" value="${package.name}"/>
    
  5. ==============================

    5.이 답변은 늦게 제공되지만 "매핑되지 않은 테이블"예외와 관련된 개념이 요약되어 있습니다 (최대 절전 모드 초보자에게 매우 흔히 발생하므로이 문제를 해결하는 데 도움이 됨). 이 오류는 많은 이유들로 인해 나타날 수 있지만, 목표는 초보자를위한 최대 절전 모드 개발자들이 많은 시간을 절약하기 위해 직면하는 가장 일반적인 문제를 해결하는 것입니다. 나는 아래에 간단한 데모를 위해 나의 예를 사용하고있다.

    이 답변은 늦게 제공되지만 "매핑되지 않은 테이블"예외와 관련된 개념이 요약되어 있습니다 (최대 절전 모드 초보자에게 매우 흔히 발생하므로이 문제를 해결하는 데 도움이 됨). 이 오류는 많은 이유들로 인해 나타날 수 있지만, 목표는 초보자를위한 최대 절전 모드 개발자들이 많은 시간을 절약하기 위해 직면하는 가장 일반적인 문제를 해결하는 것입니다. 나는 아래에 간단한 데모를 위해 나의 예를 사용하고있다.

    예외 :

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

    간단히 말해서,이 매우 일반적인 예외는 아래 코드에서 쿼리가 잘못되었음을 나타냅니다.

    Session session = this.sessionFactory.getCurrentSession();
    List<Subscriber> personsList = session.createQuery(" from subscriber").list();
    

    내 POJO 클래스 선언 방법입니다.

    @Entity
    @Table(name = "subscriber")
    public class Subscriber
    

    그러나 쿼리 구문 "from subscriber"가 정확하고 테이블 구독자가 존재합니다. 어느 것이 핵심 포인트로 나를 데려다 준다.

    그리고 그것의 설명은 여기 어떻게

    위 쿼리가 HQL이기 때문에 구독자는 테이블 이름이 아닌 엔티티 이름으로 간주됩니다. 엔터티 구독자와 매핑 된 테이블 구독자가 있으므로 코드를 다음과 같이 변경하면 문제가 해결됩니다.

    Session session = this.sessionFactory.getCurrentSession();
    List<Subscriber> personsList = session.createQuery(" from Subscriber").list();
    

    혼란에 빠지기 만하면됩니다. HQL은 많은 경우에 대소 문자를 구분합니다. 그렇지 않으면 내 경우에 효과가 있었을거야.

    https://www.tutorialspoint.com/hibernate/hibernate_query_language.htm

    Hibernate 매핑이 어떻게 작동하는지 더 이해하려면, 이것을 읽으십시오.

  6. ==============================

    6.Hibernate는 대문자 사용에 대해서도 까다 롭다. 기본적으로 첫 글자가 대문자 인 클래스 이름이됩니다. 따라서 클래스가 FooBar이면 "foobar"를 전달하지 마십시오. 정확한 대문자 사용으로 "FooBar"를 전달해야합니다.

    Hibernate는 대문자 사용에 대해서도 까다 롭다. 기본적으로 첫 글자가 대문자 인 클래스 이름이됩니다. 따라서 클래스가 FooBar이면 "foobar"를 전달하지 마십시오. 정확한 대문자 사용으로 "FooBar"를 전달해야합니다.

  7. from https://stackoverflow.com/questions/14446048/hibernate-table-not-mapped-error-in-hql-query by cc-by-sa and MIT license