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

Spring中如何将对象作为参数传递给派生查询方法及错误排查

问题原因与解决方案

问题原因

  1. SQL逻辑优先级错误:原查询中AND和OR未用括号分组,导致查询逻辑完全不符合预期,同时Spring Data JPA在解析这种混乱的SQL结构时,生成的合成参数名出现格式错误(比如错误带上分号的__$synthetic$__7;),和实际需要匹配的参数名不匹配,引发参数定位失败。
  2. 末尾分号干扰解析:原生SQL末尾的分号可能干扰Spring Data的参数解析流程,导致参数映射异常。

修正后的查询代码

@Query(value = """
        SELECT *
        FROM tom_schema.tom t
        WHERE t.title ILIKE LOWER(concat('%', :#{#tomDto.title}, '%'))
          AND t.completed = :#{#tomDto.completed}
          AND t.user_id = :#{#tomDto.userId}
          AND (t.priority_id IS NULL OR t.priority_id = :#{#tomDto.priorityId})
          AND (t.category_id IS NULL OR t.category_id = :#{#tomDto.categoryId})
          AND (t.task_date IS NULL OR t.task_date BETWEEN cast(:#{#tomDto.dateFrom} as timestamp) 
                                                    AND cast(:#{#tomDto.dateTo} as timestamp))
        """, nativeQuery = true)
Page<Tom> findWithMultiParam(TomDto tomDto, Pageable pageable);

关键修正点

  • 用括号将每个OR条件组包裹,明确查询逻辑优先级,同时避免Spring Data解析参数时出现异常。
  • 移除了查询末尾的分号,消除解析干扰。
  • 调整了条件顺序,将固定匹配的user_id等条件提前,让查询逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:25:20