You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data JPA自定义分页查询抛出IllegalArgumentException的解决

解决方案

问题核心是Spring Data JPA会自动将方法的所有参数绑定到countQuery中,但你的countQuery里没有对应参数的占位符,导致参数绑定失败。以下是两种简单可行的解决方式:

方式一:给countQuery添加无意义的参数占位符

在countQuery中添加一个不影响计数结果的参数占位符,让Spring Data能够找到对应参数完成绑定,示例代码如下:

@Query(value = "SELECT *, ST_Distance_Sphere(ST_GeomFromText(?1, 4326), location) AS distance FROM Advert_Search ORDER BY distance ",
        countQuery = "SELECT count(*) FROM Advert_Search WHERE ?1 IS NOT NULL",
        nativeQuery = true)
Page<AdvertSearch> findAllSortByDistance(String point, Pageable pageable);

这里的WHERE ?1 IS NOT NULL不会改变最终计数结果(传入的point为有效字符串,条件始终成立),但能让Spring Data成功完成参数绑定流程。

方式二:使用命名参数匹配占位符

改用命名参数,同时在countQuery中添加不影响结果的条件来匹配参数,代码示例:

@Query(value = "SELECT *, ST_Distance_Sphere(ST_GeomFromText(:point, 4326), location) AS distance FROM Advert_Search ORDER BY distance ",
        countQuery = "SELECT count(*) FROM Advert_Search WHERE :point IS NOT NULL",
        nativeQuery = true)
Page<AdvertSearch> findAllSortByDistance(@Param("point") String point, Pageable pageable);

这种方式参数名称更清晰,同样不会对计数结果产生影响。

补充提示

如果后续需要给查询添加过滤条件,务必同时在主查询和countQuery中同步条件,避免分页时出现计数与实际数据量不符的问题。

内容的提问来源于stack exchange,提问作者abidinberkay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:45:36