일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- MySQL
- 포트
- 2 > /dev/null
- 네이티브쿼리
- appspec.yml
- 테스트메소드
- 커밋메세지수정
- EC2
- 메세지수정
- Query
- 추후정리
- application.yml
- querydsl
- 컨테이너실행
- WeNews
- 서브쿼리
- docker명령어
- subquery
- ㅔㄴ션
- 메소드명
- ubuntu
- 외부키
- 참조키
- appspec
- 검색
- 예약
- 테스트
- 적용우선순위
- AuthenticationEntryPoint
- foreignkey
- Today
- Total
제뉴어리의 모든것
순수 JPA로 Join시 유의 사항 본문
- 현재 상황
아래와 같이 Board 테이블과 Member 테이블이 존재한다.
그리고 Board의 writer_id는 Member의 id를 참조하고 있다 (Board.writer_id -> Member.id)
Entity적 상황 :
N : 1 상황인 두 엔티티 Board : Member 가 있으며 (한 멤버가 게시물을 여러개 쓸 수 있으므로)
Board는 Member를 참조하고 있으며 아래는 두 Entity 구조의 구조이다.
그리고 위에 두 엔티티를 JOIN하여 가져오는 소스는 아래와 같다.
Object objects = entityManager.createQuery("select b, w from Board b left join b.writer_id w")
.getResultList();
그런데 이 소스를 실행하면 아래와같은 sql이 생성되고 에러가 발생한다.
2021-02-11 01:26:39.499 WARN 22700 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1054, SQLState: 42S22
2021-02-11 01:26:39.499 ERROR 22700 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : (conn=2587) Unknown column 'board0_.writer_id_id' in 'field list'
2021-02-11 01:26:39.519 ERROR 22700 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause
에러내용은 board0_.writer_id_id 이란 필드를 찾을 수 없다는것이다..
생성한 jpql이나 정의한 엔티티의 변수명들을 봐도 board0_.writer_id_id 이란 필드는 존재하지 않는데 도대체 어디서 저런 필드가 나온건지..
다만 여러 테스트 결과로 추측컨데 참조를 당하는 엔티티(Member)의 PK가 참조하는 테이블(Board)의 참조 필드명에 붙어서 나온다는 것이다. Board.writer_id (참조 하는쪽) + Member.id (참조 당하는쪽)
그래서 여러 시도엔 결국 엔티티에 명시적으로 @JoinColumn(name="writer_id") 필드명을 적어주니 문제는 해결됬다.
(참고로 다른 엔티티를 참조하는 참조필드의 테이블상의 필드명을 명시적으로 정의해주려면 @Column이 아니라 @JoinColumn을 사용해야한다)
그런데 어차피 writer_id라는 변수로 정의가 되어있는데.. 왜 또 @JoinColumn(name="writer_id") 이렇게 명시를 해줘야하는건지 파악이 되질 않는다..
그리고 다른 프로젝트에서는 @JoinColumn(name="writer_id") 을 쓰지 않아도 잘 됬어는데..
추후 자세히 알아봐야겠다