Собственный запрос JpaRepository не обнаруживает параметры - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь написать собственный запрос в моем приложении SpringBoot, чтобы получить ближайшее местоположение к любой заданной координате.Ниже приведен JpaRepository для того же самого:

@Repository
public interface OfferRepository extends JpaRepository<Offer, Long> {
    @Query(value = "SELECT *, MIN(6371000 * acos( cos( radians(:latitude) ) * cos( radians( dest.latitude ) ) * cos( radians( dest.longitude ) - radians(:longitude) ) + sin( radians(:latitude) ) * sin( radians( dest.latitude ) ))) as  distance FROM offer dest GROUP BY dest.id having MIN(distance)",
            nativeQuery = true)
    Tuple getClosestOffer(double latitude, double longitude);
}

Проблема, с которой я сталкиваюсь, заключается в том, что переданная широта и долгота не задаются в строке запроса.Вместо этого они заменяются знаками вопроса, как показано ниже:

SELECT *, MIN(6371000 * acos( cos( radians(?) ) * cos( radians( dest.latitude ) ) * cos( radians( dest.longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( dest.latitude ) ))) as  distance FROM offer dest GROUP BY dest.id having MIN(distance)

Я даже пробовал с пронумерованными параметрами, но с тем же результатом.Что я здесь не так делаю?Как это решить?

1 Ответ

2 голосов
/ 30 июня 2019

Вы можете использовать Именованные параметры , используя @ Param аннотацию

public interface OfferRepository extends JpaRepository<Offer, Long> {
    @Query(value = "SELECT *, MIN(6371000 * acos( cos( radians(:latitude) ) * cos( radians( dest.latitude ) ) * cos( radians( dest.longitude ) - radians(:longitude) ) + sin( radians(:latitude) ) * sin( radians( dest.latitude ) ))) as  distance FROM offer dest GROUP BY dest.id having MIN(distance)",
            nativeQuery = true)
    Tuple getClosestOffer(@Param("latitude") double latitude, @Param("longitude") double longitude);
}

или использовать Индексированные параметры:? 1? 2 inвам jpql

public interface OfferRepository extends JpaRepository<Offer, Long> {
    @Query(value = "SELECT *, MIN(6371000 * acos( cos( radians(?1) ) * cos( radians( dest.latitude ) ) * cos( radians( dest.longitude ) - radians(?2) ) + sin( radians(?1) ) * sin( radians( dest.latitude ) ))) as  distance FROM offer dest GROUP BY dest.id having MIN(distance)",
            nativeQuery = true)
    Tuple getClosestOffer(double latitude, double longitude);
}

, если вы хотите показать разрешенные параметры в вашем журнале, просто установите уровень ведения журнала org.hibernate.type в trace

application.properties:

spring.jpa.show-sql=true
logging.level.org.hibernate.type=trace
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...