Spring Data JPA如何通过多个id查询获取表中指定行数据
现有代码的核心问题
- 参数映射不匹配:注解
@Param配置的参数名是albumsIds,但SQL语句中引用的占位符是:row_ids,二者名称不一致,框架无法完成参数注入,运行时会直接抛出参数找不到的异常。 - SQL逻辑完全失效:你传入的拼接了
or的字符串会被框架当成单个完整字符串值处理,最终生成的SQL等价于WHERE r.row_id = 'id:1 or id:2 or id:3',也就是拿行ID和一整串带or的文本做等值比较,根本不会被解析成多个OR连接的判断条件,完全达不到多ID匹配的效果。另外你预期写的目标SQL里在id:1后多了多余的逗号,本身就不符合SQL语法规范,执行会直接报错。 - 存在严重安全隐患:手动拼接SQL片段作为参数传入的写法,没有做任何转义处理,存在SQL注入风险,传入内容如果包含恶意SQL语句,会直接导致数据泄露、篡改甚至删除。
推荐实现方案
优先使用SQL标准的IN语法做批量ID匹配,比拼接多个OR条件可读性更强、执行效率更高,同时完全规避SQL注入风险,代码如下:
@Query(value = "SELECT * FROM row r where r.row_id IN :rowIds", nativeQuery = true) List<Object> temp(@Param("rowIds") List<String> rowIds);
调用方法时,直接把需要查询的ID封装成List/Set类型的集合传入即可,比如传入Arrays.asList("id:1", "id:2", "id:3"),JPA会自动把集合展开为IN语句对应的参数序列,自动完成特殊字符转义,不需要手动拼接任何字符串。
注意:
@Param注解配置的参数名必须和SQL中占位符:xxx的名称完全一致,否则会出现参数绑定失败的问题。
如果需要动态拼接数量不定的查询条件,也可以使用JPA的Specification功能做动态条件构造,不要自行拼接SQL片段传入。
内容的提问来源于stack exchange,提问作者Daniel Morales
相关产品推荐
相关产品推荐

