[오류해결] org.hibernate.hql.internal.ast.QuerySyntaxException

2022. 1. 30. 13:30·Spring/Hibernate

 

하이버네이트를 통해 쿼리를 사용하다보면 꼭 한 번은 만나볼 오류 중 하나이다.

org.hibernate.hql.internal.ast.QuerySyntaxException: board is not mapped [from board order by id]
org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:220)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)
org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113)
org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73)
org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162)
org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:636)
org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:748)
org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:848)
org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:114)
com.bigbell.noticeboard.dao.BoardDAOImpl.getBoard(BoardDAOImpl.java:26)
com.bigbell.noticeboard.service.BoardServiceImpl.getBoard(BoardServiceImpl.java:22)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
com.sun.proxy.$Proxy48.getBoard(Unknown Source)
com.bigbell.noticeboard.controller.NoticeBoardController.listBoard(NoticeBoardController.java:23)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

 

전제

필자는 지금 Board라는 클래스를 Entity로 설정하여 hibernate의 query를 이용해 데이터베이스 테이블인 "board"의 정보를 가져오려고 시도 중이었다.

 

오류해석

첫번째 줄을 잘 살펴보자.

org.hibernate.hql.internal.ast.QuerySyntaxException: board is not mapped [from board order by id]

board로 mapping되지 않는다는 말인데 대체로 2가지 문제 중 하나로 인해 생긴다. 하나씩 살펴보자.

 

 

 

 

1. query를 적을 때 잘못된 클래스명을 사용


@Entity
@Table(name="board")
public class Board {
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id")
	private int id;
    
    ......
}

위와 같은 Entity가 있다. 클래스명은 Board 이고 이를 table인 "board"와 연결시켰다.

 

잘못된 query 작성

@Repository
public class BoardDAOImpl implements BoardDAO {
	
	// inject the sessionFactory
	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public List<Board> getBoard() {
		
		Session currentSession = sessionFactory.getCurrentSession();
		
		Query<Board> query = 
				currentSession.createQuery("from board order by id", Board.class);
		
		List<Board> boards = query.getResultList();
		
		return boards;
	}


}

위 파일은 데이터베이스 테이블에서 정보를 가져오기 위한 DAO.java 파일의 일부분이다.

여기서 어떤 것이 잘못됐을까? 당연히 쿼리문이다.

 

 

오류원인

Query<Board> query = 
		currentSession.createQuery("from board order by id", Board.class);

쿼리문을 적을 때 from 뒤에 테이블이름이 아닌 Entity로 설정된 클래스명을 적어줘야하는데

여기서 대소문자 구분이 아주 중요하다!! 

 

 

오류해결

Query<Board> query = 
		currentSession.createQuery("from Board order by id", Board.class);

board를 클래스명과 대소문자도 아예 같게 Board로 고쳐주면 정상실행될 것이다.

(웬만하면 여기서 해결된다. 그래도 안된다면 2번, 3번 참고)

 

 

 

 

 

2. sevlet.xml을 활용하는 경우, servlet.xml 에서의 오류(동적 웹 프로젝트, 메이븐 둘 다 해당)


1번에서 문제가 해결되지 않는다면?

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Board is not mapped [from Board order by id]

위와 같은 오류가 발생했을 것이다.

확인해보면 "Board is not mapped [from Board order by id]" 이라고 적혀있다.

분명히 Board로 클래스명과 똑같이 맞춰줬는데도 같은 오류가 발생하고 있다. 왜일까?

여기서 문제는 servlet.xml일 가능성이 크다.

 

스프링과 하이버네이트를 사용하면 따로 servlet.xml을 만들어 의존성을 주입하는데

sessionFactory를 구성할 때 문제가 생긴 것이다.

Board의 파일경로

일단 Board의 파일 경로를 보자. com.bigbell.noticeboard.entity 로 되어있다.

servlet.xml에서 sessionFactory가 어떤 경로를 탐색하는지 살펴보자.

<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="dataSource" ref="myDataSource" />
		<property name="packagesToScan" value="com.bigbell.noticeboard.entiii" />
		<property name="hibernateProperties">
		   <props>
		      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
		      <prop key="hibernate.show_sql">true</prop>
		   </props>
		</property>
   </bean>

 

오류원인

<property name="packagesToScan" value="com.bigbell.noticeboard.entiii" />

경로가 com.bigbell.noticeboard.entity와는 마지막 부분이 약간 다르게 되어 있다.

대부분 오타로 인해 문제가 발생할 가능성이 높다.

 

 

문제해결

<property name="packagesToScan" value="com.bigbell.noticeboard.entity" />

경로를 Entity인 Board 클래스와 똑같이 맞춰주면 문제는 말끔히 해결될 것이다.

 

 

 

 

 

3. No Xml인 프로젝트(@Configuration 사용)의 경우, properties파일 내용 오류


아래와 같이 하이버네이트 컨트롤에 사용되는 properties파일이 있다고 해보자.

# JDBC connection properties
#
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/데이터베이스명?useSSL=false&serverTimezone=UTC
jdbc.user=mysql사용자아이디
jdbc.password=mysql사용자비밀번호

#
# Connection pool properties
#
connection.pool.initialPoolSize=5
connection.pool.minPoolSize=5
connection.pool.maxPoolSize=20
connection.pool.maxIdleTime=3000

#
# Hibernate properties
#
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.packagesToScan=com.bigbell.springdemo.entiii

하이버네이트를 사용할 때 properties파일을 사용해서 연결을 시도해야하는데,

이 과정 중 package 스캔 부분을 잘못 설정하면 QuerySyntaxException 오류가 발생하곤 한다.

위의 코드 중 무엇이 잘못됐을까?

 

 

오류원인

hibernate.packagesToScan=com.bigbell.springdemo.entiii

패키지 스캔을 진행할 패키지명에 오류가 있다.

 

문제해결

hibernate.packagesToScan=com.bigbell.springdemo.entity

패키지명의 오타를 확인하고 잘 고쳐주자.

 

 

'Spring/Hibernate' 카테고리의 다른 글
  • 실무에서 @Transactional을 제거했더니 성능이 2배 향상된 이유
  • [오류해결] java.lang.NullPointerException - 스프링 & 하이버네이트
  • [Spring] 하이버네이트(Hibernate) 사용하는법
gakko
gakko
좌충우돌 개발기
  • gakko
    MYVELOP 마이벨롭
    gakko
  • 전체
    오늘
    어제
    • 분류 전체보기 (205)
      • Spring (23)
        • Spring (10)
        • Spring Boot (7)
        • Spring Security (1)
        • Hibernate (4)
      • Test (3)
      • 끄적끄적 (6)
      • 활동 (35)
        • 부스트캠프 (23)
        • 동아리 (3)
        • 컨퍼런스 (3)
        • 글또 (5)
        • 오픈소스 컨트리뷰션 (1)
      • 디자인패턴 (0)
      • Git & GitHub (22)
        • Git (13)
        • Github Actions (1)
        • 오류해결 (5)
        • 기타(마크다운 등) (3)
      • 리눅스 (6)
        • 기초 (6)
        • 리눅스 서버 구축하기 (0)
      • Infra (2)
        • Docker (1)
        • Elastic Search (0)
        • Jenkins (1)
        • AWS (1)
      • MySQL (7)
        • 기초 (6)
        • Real MySQL (1)
      • 후기 (3)
        • Udemy 리뷰 (3)
      • CS (26)
        • 웹 기본지식 (0)
        • 자료구조 (13)
        • 운영체제 OS (12)
        • 데이터베이스 (1)
        • 시스템 프로그래밍 (0)
        • 기타 (0)
      • Tools (1)
        • 이클립스 (1)
        • IntelliJ (0)
      • 프로젝트 (2)
        • 모여모여(부스트캠프) (1)
      • JAVA (32)
        • Maven (6)
        • 오류해결 (11)
        • 자바 클래스&메소드 (1)
        • JSP & Servlet (12)
      • Javascript (5)
        • 기초 (3)
        • React (2)
      • Python (28)
        • 파이썬 함수 (9)
        • 알고리즘 문제풀이 (16)
        • 데이터 사이언스 (2)
        • 웹 크롤링 (1)
      • 단순정보전달글 저장소 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 우진님
  • 공지사항

  • 인기 글

  • 태그

    파이썬
    알고리즘
    부스트캠프 7기
    Python
    Spring
    MySQL
    부스트캠프
    os
    Git
    운영체제
    오류해결
    부스트캠프 멤버십
    java
    스프링부트
    jsp
    자바
    자바스크립트
    GitHub
    웹개발
    스프링
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
gakko
[오류해결] org.hibernate.hql.internal.ast.QuerySyntaxException
상단으로

티스토리툴바