我正在尝试在我的 SpringBoot 应用程序中编写 native 查询,以获取最接近任何给定坐标的位置。以下是相同的 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)
我什至尝试使用带编号的参数,但结果相同。我在这里做错了什么?如何解决?
最佳答案
您可以通过@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);
}
或者在你的 jpql 中使用 Indexed Parameters: ?1 ?2
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
应用程序属性:
spring.jpa.show-sql=true
logging.level.org.hibernate.type=trace
关于hibernate - JpaRepository native 查询未检测参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56823254/