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

Spring Boot JPA Repository中IS NULL、LIKE操作失效问题求助

问题根因

你遇到的ORA-01722报错和动态条件不生效的问题,由以下几个错误共同导致:

  • 查询语句错误添加了@Modifying注解:该注解仅用于增删改这类数据变更操作,SELECT查询添加后会破坏SQL执行逻辑
  • 动态筛选条件错误写在了JOIN的ON子句中,而非独立的WHERE子句,关联逻辑和筛选逻辑混淆导致空参数时判断失效
  • LIKE通配符拼接写法错误,原生SQL中直接写%:name%无法正常解析绑定参数
  • 字段类型不匹配:USER表的no字段为数值类型,方法参数no为String类型,Oracle执行隐式类型转换时触发ORA-01722无效数字报错

修复方案

第一步:调整注解和参数类型

移除@Modifying注解,根据数据库no字段的实际类型调整方法入参类型,如果数据库no是数值类型,将参数类型改为Long,避免类型转换问题,同时给查询事务加只读标识提升性能。

第二步:修正SQL写法

修改后的完整代码如下:

@Transactional(readOnly = true)
@Query(value = "SELECT U.* FROM USER U  "
        + "LEFT JOIN CV ON U.USERID=CV.USERID  "
        + "JOIN PROFIL P ON P.CV_ID=CV.CV_ID  "
        + "WHERE (:name IS NULL OR P.name LIKE CONCAT('%', :name, '%')) "
        + "AND (:surname IS NULL OR P.surname LIKE CONCAT('%', :surname, '%')) "
        + "AND (:no IS NULL OR U.no = :no) ", nativeQuery = true)
public List<User> findByDynamicQuery(@Param("name") String name, @Param("surname") String surname, @Param("no") Long no);

特殊兼容处理

如果你必须保留no参数为String类型,可以将SQL中no的判断条件改为显式类型转换,避免隐式转换报错:

AND (:no IS NULL OR TO_CHAR(U.no) = :no)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:30:00