use*_*812 10 jpql spring-data-jpa
这是我的存储库:
@Repository
public interface MyRepository extends JpaRepository<Entity, Long> {
public static final String DISTANCE = "((acos(sin(?1 * pi() / 180) * sin(a.latitude * pi() / 180) + cos(?1 * pi() / 180) * cos(a.latitude * pi() / 180) * cos((?2 - a.longitude) * pi() / 180)) * 180 / pi()) * 60 * 1.609344) as distance";
@Query("select new package.SearchResult(" + DISTANCE + ", a.addressOwner) from Address a group by a.addressOwner, col_0_0_ having col_0_0_ < ?3 order by col_0_0_")
public Page<SearchResult> findClosestByCoordinates(double lat, double lng, double maxDistance, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试执行此方法时,会发生异常:
具有该位置[1]的参数不存在; 嵌套异常是java.lang.IllegalArgumentException:具有该位置的参数[1]不存在']
但是,当我更换Page<SearchResult>与List<SearchResult>一切工作就好了.是Spring的bug还是什么?
更新:我想我发现了什么错误:当所有参数都参与where子句时,一切都很好.但如果其中至少有一个没有在那里使用,那就失败了.但我不明白为什么它会发生在Page上,并且在使用List时不会发生.处理它的最佳方法是什么?
Ash*_*ari 10
您可以通过使用@Param("query_param_name")批注进行查询,使查询更清晰易懂.
@Repository
public interface MyRepository extends JpaRepository<Entity, Long> {
public static final String DISTANCE = "((acos(sin(:lat * pi() / 180) * sin(a.latitude * pi() / 180) + cos(:lat * pi() / 180) * cos(a.latitude * pi() / 180) * cos((:lng - a.longitude) * pi() / 180)) * 180 / pi()) * 60 * 1.609344) as distance";
@Query("select new package.SearchResult(" + DISTANCE + ", a.addressOwner) from Address a group by a.addressOwner, col_0_0_ having col_0_0_ < :maxDistance order by col_0_0_")
public Page<SearchResult> findClosestByCoordinates(@Param("lat")double lat, Param("lng")double lng, @Param("maxDistance") double maxDistance, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)
当spring找不到在查询中输入方法参数的位置时会出现此错误.因此,使用@Param()注释将查询参数和方法参数绑定在一起并增加查询的简单性
| 归档时间: |
|
| 查看次数: |
33290 次 |
| 最近记录: |