Spring中如何将对象作为参数传递给派生查询方法及错误排查
问题原因与解决方案
问题原因
- SQL逻辑优先级错误:原查询中
AND和OR未用括号分组,导致查询逻辑完全不符合预期,同时Spring Data JPA在解析这种混乱的SQL结构时,生成的合成参数名出现格式错误(比如错误带上分号的__$synthetic$__7;),和实际需要匹配的参数名不匹配,引发参数定位失败。 - 末尾分号干扰解析:原生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
相关产品推荐
相关产品推荐

