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

Spring Boot集成MongoDB:如何直接查询prize>0的记录

解决Spring Boot MongoDB @Query参数索引不匹配的报错问题

嘿,这个问题我之前也踩过坑!咱们来一步步把它捋明白:

错误原因

你修改后的查询语句里还在用?1、?2、?3这些占位符,但方法参数已经从4个变成3个了。MongoDB的@Query注解里的参数占位符是从0开始按方法参数顺序编号的,现在参数少了一个,原来的索引就全部错位了,自然会报参数索引无效的错误。

正确的修改方式

把查询语句里的占位符索引对应调整成当前方法参数的顺序就好,具体来说:

  • 原来的?1(对应endDateAndTime)现在要改成?0
  • 原来的?2(对应apiName)改成?1
  • 原来的?3(对应service)改成?2

修改后的完整代码如下:

@Query("{'prize' : {$gt : 0 }, 'logDate' : {$lt : ?0} , 'api' : ?1 , 'service' : ?2}")
List<SomeLog> findByLogDateBeforeAndApiAndService(Date endDateAndTime, ApiName apiName, String service);

更稳妥的小技巧:使用命名参数

如果怕以后参数增减导致索引混乱,推荐用命名参数的方式,可读性和维护性更好。只需要给方法参数加上@Param注解,然后在查询语句里用:参数名来引用:

@Query("{'prize' : {$gt : 0 }, 'logDate' : {$lt : :endDate} , 'api' : :apiName , 'service' : :service}")
List<SomeLog> findByLogDateBeforeAndApiAndService(
    @Param("endDate") Date endDateAndTime, 
    @Param("apiName") ApiName apiName, 
    @Param("service") String service
);

这样不管参数顺序怎么变,只要名字对应上就不会出错,也更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:28:22