에러해결 Log) QueryException could not resolve property column of entity
사용환경
- MacBook Air (M1, 2020) 16GB
- OpenJDK 11
- IntelliJ IDEA Community
에러의 발생
QueryException could not resolve property : column of entity
- API 서버를 만들면서 모든 파라미터를 정확하게 작성했다고 생각했는데 이런 오류 메세지가 나오면서 응답에 대한 요청을 보내지 못하는 것이었다. 500에러 한가득 받음…
- 내가 원해던 것은
/diaries/{id}
URL로 회원의 아이디를 적어 보내면 해당 회원이 작성한 일기 전체 목록을 응답하는 서버였다.
문제 해결
- 원인은 쿼리를 잘못 작성한 것이었다…
- 쿼리문의
where
절에 회원의 아이디를 매핑하는 부분에서 매핑할 컬럼명을 잘못 작성한 것이 원인이었다.
@Entity
@Getter
@NoArgsConstructor
public class Diary {
@JoinColumn(name = "member_id", nullable = false)
@JsonIgnore
private Member member;
}
- 일기 엔티티에서 회원 엔티티를 외래키로 설정하면서 컬럼이름을
member_id
라고 지정해서 테이블에는member_id
라는 이름으로 생성되었다.
select d from Diary d where d.member_id = :member_id
-
그래서 당연히 이런 쿼리를 작성했다. 하지만 나를 맞이하는 오류 메세지
-
구글링 결과 쿼리문 내의 컬럼 값을 실제 테이블의 컬럼 이름이 아닌 엔티티 내의 필드명으로 입력을 해 주어야 했다.
@Entity
@Getter
@NoArgsConstructor
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
public Member(String name) {
this.name = name;
}
@Column(nullable = false)
private String name;
private String password;
}
- 일기 엔티티에서는 위와 같이 구성된 회원 엔티티를 필드값으로 사용하고 있었기 때문에 회원.id로 매핑을 해 주어야 했던 것이다!
select d from Diary d where d.member.id = :member_id
- 즉 쿼리문을 이렇게 작성하는 것이 올바른 것이었다. 이렇게 수정 후 정상 작동되는 것을 확인할 수 있었다.
정리
- 처음에는 쿼리문을 올바르게 작성했다고 생각했기 때문에 오류 메세지를 납득할 수 없었다. 왜 프로퍼티를 찾지 못하는 것일까?
- 하지만 역시 구글에는 없는 것이 없었고 이내
Querydsl
을 잘못 알고 있었다는 것을 알 수 있었다. 이름이 비슷할 뿐 실제 SQL 쿼리문은 아니며JPA
를 위한 쿼리문인 만큼 작성하는 관점 자체가 DB 테이블이 아닌 엔티티여야 한다는 것을 깨달았다.
참고
@Query : QueryException could not resolve property : column of entity