저는 위치 관련 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
를 통해 생성된 Query
에 setParameter
메서드로 파라미터를 할당해주고 있었는데 이렇게 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
를 생성해서 한번에 파라미터로 할당해주었습니다.