java.lang.IllegalArgumentException:该位置[1]的参数不存在

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()注释将查询参数和方法参数绑定在一起并增加查询的简单性


小智 1

原因Page需要调用额外的count Query,而List不需要。这个错误肯定是count查询引起的。 看到这里,最像同样的问题