hibernate - JpaRepository native 查询未检测参数

标签 hibernate spring-boot jpa spring-data-jpa

我正在尝试在我的 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/

相关文章:

spring-boot - 使用 spring boot Jersey starter 部署为 WAR 时的映射冲突

hibernate - 如何在我的应用程序中集成或使用 KeyCloak 用户数据库?

java - org.hibernate.Session 和 org.hibernate.classic.Session 之间的区别

hibernate - Hibernate在Database First开发中找不到表

java - 如何在带有嵌入式tomcat的Spring Boot应用程序中设置域名

java - Spring AOP 切入点表达式排除特定的返回类型或参数

java - Hibernate - 回滚 : org. hibernate.MappingException:未知实体

java - @TableGenerator : how to use

grails - 在Grails和Vaadin的项目中使用JPAContainer?

java - @OneToMany 双向 - 连接列插入 "null"值( hibernate )