2020년 8월 3일 월요일

JPA 메서드로 쿼리 생성시 주의 사항

메서드로 쿼리를 만들다 보면 분명 정확하게 했는데 
Unable to locate Attribute  with the the given name [] on this ManagedType []
이런 오류를 뱉으면서 안될때가 있다.

뭐 당연히 변수 명은 camelcase 로 정의 했을것이고
method 에서는 대문자로 시작했지.

Entity
private String aTest;

Repository
private findByATest(String aTest);

이렇게 하면 문제 없는거 아냐?

문제 없을것 같지만 안된다

문제의 원인은 
위 Entity 에서 정의한 변수명 룰에 있다.
첫 시작 소문자가 1자리면 안된다.

예를 들어 
Entity
private String aaTest;

Repository
private findByAaTest(String aTest);

로 수정 후 테스트 시 문제 없는것을 확인 했다.

문제를 알았으니 왜 인지를 알아야 하는데
아직 모르겠다.
왜일까..

이런 저런 정보를 보았을때 Java Bean naming conventions 에 영향을 받는것이 아닌가 싶다..


-- 정리 --
해당 문제를 피해갈수 있는 방법
1. 변수의 시작을 무조건 소문자 한자리로 시작 하지 않는다.
    aTest => aaTest
2. 룰에 맞지 않는 변태 같은 짓이지만 변수의 시작을 대문자로 바꾼다.
    aTest => ATest

해당 문제가 발생 한 이유는
Entity 에 테이블의 접두사 T 를 항상 붙였다.
예를 들어 code 관련 테이블은 TCode
이럴때 당연히 camelcase 로 변경 하면 tCode 인데 
이것때문에 문제가 생겼다.

우선 근본적인 원인을 찾기 전까지는 접두사 T 를 붙이는 짓은 피하자.