[JPA] Could not locate named parameter (sql 문자열 속 parameter)

Cho-D-YoungRae·2022년 11월 10일
0

문제

저는 위치 관련 MySQL 함수를 사용해야되서 native query 를 통해 아래와 같이 Repository 메서드를 구현하고 있었습니다.

위 메서드를 통해서 생성되는 SQL문은 아래와 같습니다.

SELECT r.restaurant_id,
       r.name,
       r.phone,
       r.address_name,
       r.road_address_name,
       r.location,
       r.use_yn,
       r.created_at,
       r.last_modified_at
FROM restaurant r
WHERE r.name LIKE :name
  AND :distance >= ST_DISTANCE_SPHERE(r.location, ST_POINTFROMTEXT('point(:y :x)', 4326))
  AND r.use_yn = TRUE
ORDER BY ST_DISTANCE_SPHERE(r.location, ST_POINTFROMTEXT('point(:y :x)', 4326));

해당 메서드는 동적 쿼리가 되도록 작성되고 있으며 중간의 setParameter 를 통해서 필요한 파라미터도 모두 할당하고 있는데 아래와 같은 에러가 발생되었습니다.

Could not locate named parameter [x], expecting one of [distance, name]; nested exception is java.lang.IllegalArgumentException: Could not locate named parameter [x], expecting one of [distance, name]

해결

위의 SQL의 ST_POINTFROMTEXT('point(:y :x)', 4326) 부분을 보시면 SQL의 문자열 안에 파라미터 :x, :y 가 할당된 것을 볼 수 있습니다. 저는 EntityManager 를 통해 생성된 QuerysetParameter 메서드로 파라미터를 할당해주고 있었는데 이렇게 SQL의 문자열 안에 파라미터는 인식하지 못 하는 것을 보입니다.

그래서 저는 SQL이 아래와 같이 생성되도록 수정하였고

SELECT r.restaurant_id,
       r.name,
       r.phone,
       r.address_name,
       r.road_address_name,
       r.location,
       r.use_yn,
       r.created_at,
       r.last_modified_at
FROM restaurant r
WHERE r.name LIKE :name
  AND :distance >= ST_DISTANCE_SPHERE(r.location, :curLoc)
  AND r.use_yn = TRUE
ORDER BY ST_DISTANCE_SPHERE(r.location, :curLoc);

문제가 되는 부분을 Point 를 생성해서 한번에 파라미터로 할당해주었습니다.

0개의 댓글