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
相关产品推荐
相关产品推荐

