좌표 간 거리를 계산해 가까운 거리 순으로 데이터를 가져오기 위해 MySQL에 ST_Distance_Sphere()함수를 사용할 것이며. 현재 진행하는 프로젝트에서는 Querydsl을 사용 하기때문에 Querydsl에서 SQL Function사용을 통해 쿼리를 작성해야 해서 사용법을 정리하려고 합니다.
ST_Distance_Sphere()
는 두 점 사이의 거리르 meter
단위로 변환하는 함수입니다.
SET @location = POINT(127.036377, 37.500643);
SELECT ST_Distance_Sphere(@location,
POINT(trade_longitude, trade_latitude)) AS distance,
deal.trade_longitude,
deal.trade_latitude
FROM deal
order by distance;
SQL Function
은 Expressions.stringTemplate()
를 통해 사용할 수 있습니다.
Expressions.stringTemplate()을 사용해 문자열로 직접 함수를 작성 하며, StringExpression
을 반환하여 select
문에서 사용할 수 있게 해줍니다.
사용방법 - Expressions.stringTemplate("ST_Distance_Sphere({0}, {1})",파라미터1, 파라미터2)
List<Deal> content = queryFactory
.selectFrom(deal)
.where(
categoryEq(dealFilterRequest.getCategory()),
categoryDetailEq(dealFilterRequest.getCategoryDetail()),
deal.deletedAt.isNull()
)
.join(deal.user, user).fetchJoin()
.join(deal.location, location).fetchJoin()
.limit(pageable.getPageSize())
.offset(pageable.getOffset())
.orderBy(Expressions.stringTemplate("ST_Distance_Sphere({0}, {1})",
Expressions.stringTemplate("POINT({0}, {1})",
dealFilterRequest.getCurrentLongitude(),
dealFilterRequest.getCurrentLatitude()
),
Expressions.stringTemplate("POINT({0}, {1})",
deal.tradeLongitude,
deal.tradeLatitude
)
).asc(),
deal.createdAt.desc())
.fetch();
위에 코드를 실행하면 아래처럼 쿼리가 나가는걸 확인할 수 있습니다.
선생님..whwere절에 쓰고싶은데 빨간줄 뜨는데 어떻게 하면 될까요..\
Required type : Predicate
Provided : StringTemplate
마우스 갖다대면 이렇습니다.. 대충 타입이 안맞는다 같은데 ... 웨어절에 써서 x미터보다 가까운 객체들 뽑아오고 싶은데 안됩니다 혹시 방법 알고 계신가요 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ