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

Spring JPA首次查询正常再次查询触发回滚的原因及解决方法

问题原因与解决方案

回滚原因

回滚的直接触发点是查询过程中抛出了RuntimeException,Spring的@Transactional注解默认会在抛出RuntimeException时触发事务回滚——即使是readOnly=true的只读事务,只要出现未捕获的RuntimeException,就会触发回滚操作。

而抛出异常的核心根源有两个:

1. Repository方法名与字段映射不匹配

Service中调用的是memberRepository.findBySpotrightIdContainsAndIsDeletedIsFalse(spotrightId),但Repository定义的方法却是findBySIdContainsAndIsDeletedIsFalse(String sId)。

  • 方法名中的SId与实体类的spotrightId字段完全不对应,导致Spring Data JPA在解析方法名生成SQL时,参数处理逻辑出现异常,最终抛出IllegalArgumentException: Parameter value [\\] did not match expected type [java.lang.String]。

2. Controller参数传递错误

Controller方法接收的参数是String sId,但调用Service时传入的是未定义的spotrightId变量,这会导致编译错误或运行时传入错误的参数值(比如非法转义符\\),进一步触发参数类型不匹配异常。


解决方案

1. 修正Repository方法名

将Repository方法名改为与实体类字段、Service调用一致:

public interface MemberRepository extends JpaRepository<Member, Long> {
    // 匹配实体类的spotrightId字段,与Service调用的方法名对齐
    List<Member> findBySpotrightIdContainsAndIsDeletedIsFalse(String spotrightId);
}

2. 修正Controller参数传递

确保传入Service的参数是正确的路径变量:

@GetMapping("/s-id/{s-id}")
public ResponseEntity<DefaultResponseDto<Object>> findManyBySId(HttpServletRequest servletRequest,
                                                                @PathVariable(name = "s-id") String sId) {
    // ...
    List<Member> members = memberService.findManyBySId(sId); // 使用正确的参数sId
    // ....
}

3. 处理参数特殊字符(可选)

如果请求参数可能包含反斜杠等特殊字符,在Controller层提前做转义或过滤,避免JPA解析出错:

@GetMapping("/s-id/{s-id}")
public ResponseEntity<DefaultResponseDto<Object>> findManyBySId(HttpServletRequest servletRequest,
                                                                @PathVariable(name = "s-id") String sId) {
    // 处理反斜杠转义,避免参数解析异常
    if (sId != null) {
        sId = sId.replaceAll("\\\\", "\\\\\\\\");
    }
    List<Member> members = memberService.findManyBySId(sId);
    // ....
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:46:09