JPA模糊查询公司名称时遇index out of range:0错误求助
解决JPA模糊查询出现
index out of range: 0错误的方案 一、原生查询的错误修复
你的原生SQL写法存在问题,:keyword被单引号包裹后,JPA无法识别为参数占位符,会把整个'%:keyword%'当作普通字符串处理,导致参数绑定失败,进而引发索引越界错误。可以通过两种方式修正:
- 使用数据库字符串拼接函数(适配多数数据库):
@Query(value="select * from company where name like CONCAT('%', :keyword, '%')", nativeQuery=true) public List<Company> getByName(@Param("keyword") String keyword);
- 在Java代码层给参数添加通配符,SQL中直接使用占位符:
// 方法定义不变,调用时传入带%的参数,比如 "%abc%" @Query(value="select * from company where name like :keyword", nativeQuery=true) public List<Company> getByName(@Param("keyword") String keyword);
二、JPA方法名查询的注意事项
findByNameContaining:JPA会自动在参数前后添加%,调用时直接传入关键词(比如"abc")即可,无需手动拼接通配符。若传入空字符串或null,可能触发异常,建议调用前做非空校验。findByNameLike:需要手动给参数添加%,比如调用时传入"%abc%",如果仅传纯关键词,会变成精确匹配,参数处理不当也可能引发错误。
三、额外排查点
- 检查传入的
keyword参数是否为null或空字符串,空值会导致SQL解析异常,建议在业务层提前过滤无效参数。 - 5万条数据量不算极大,但频繁模糊查询会触发全表扫描,建议给
company表的name字段创建全文索引(如MySQL的FULLTEXT索引),既提升查询性能,也能避免因全表扫描引发的潜在异常。
内容的提问来源于stack exchange,提问作者Rahul Suryawanshi
相关产品推荐
相关产品推荐

