HQL과 @Entity에 있는 name 속성의 관계
ejb 3.0 spec 8장 제일 처음에 나오는 @Entity에 대한 설명을 찾아 보게 된 원인은 HQL을 작성하려다가 다음과 같은 형상이 벌어졌기 때문입니다.
@Entity
Member{}
Member{}
이런 클래스가 있고 이 클래스에 대한 HQL을 작성할 때 다음과 같이 작성을 하면 에러가 발생합니다.
Session s;
s.createQuery("from member");
s.createQuery("from member");
"" 안에는 HQL이라고 SQL과 비슷한 구문이 들어가지만 SQL은 테이블명과 컬럼명을 기준으로 작성하고 select가 있어야 하지만 HQL은 from만 필수 요소이고 클래스명과 멤버변수명으로 작성을 한다고 배웠습니다. 따라서 다음과 같이 작성해야 원하는 대로 작업이 수행됩니다.
s.createQuery("from Member");
문제는 @Entity의 속성중에 name 속성에 값을 줬을 때 발생합니다.
@Entity(name = "K_Member")
KMember{}
KMember{}
이런 클래스가 있을 때 클래스명을 사용해서 다음과 같이 HQL을 만들려고 해보지만
s.createQuery("from KMember");
KMember is not Mapped라는 에러 메시지를 볼 수 있습니다.
s.createQuery("from K_Member");
이렇게 @Entity의 name 속성에 지정한 이름으로 작성해야 원하는 결과를 얻을 수 있습니다.
결과적으로 HQL에서 쿼리를 작성할 때 @Entity 어노테이션의 name 속성에 들어가는 값을 사용해야 하며 대소문자를 구분합니다. @Entity의 name에 지정해 주는 값은 DB에서 테이블 명이 되기도 하지만 일치 하지는 않습니다. postgres에서 확인해본 결과 DB에 들어간 테이블 명은 k_member와 같이 전부 소문자로 바뀝니다. 따라서 클래스명이 바뀐다고 생각을 하는 편이 더 이해하기 쉬울 것 같습니다.
물개 선생님께서 알려 주셔서 테스트를 @Column의 name 속성을 주고 HQL을 작성할 때 name 속성에 넣은 값을로도 해봤습니다. 하지만 멤버변수들은 @Column의 name에 넣어준 값에 영향을 받지 않습니다. 멤버변수명으로 해야 HQL Query Exception이 발생하지 않습니다.
물개 선생님께서 알려 주셔서 테스트를 @Column의 name 속성을 주고 HQL을 작성할 때 name 속성에 넣은 값을로도 해봤습니다. 하지만 멤버변수들은 @Column의 name에 넣어준 값에 영향을 받지 않습니다. 멤버변수명으로 해야 HQL Query Exception이 발생하지 않습니다.
bm223.pdfp157 에 간단하게 설명이 있습니다. @Entity의 name속성에 지정한 값은 쿼리에서 사용 되며 JPQL의 예약어 이면 안된다고 합니다.