如何使用createNativeQuery编写IN子句?
使用createNativeQuery编写IN子句的正确方式
嘿,我来帮你搞定这个问题!你用CODE IN (:codeList)写法拿不到数据,核心原因是JPA没办法自动把逗号分隔的字符串参数拆成IN子句需要的多个独立值。下面给你几种实用的解决办法:
推荐方法:直接传入集合类型参数
这是最规范也最安全的做法,你只需要把codeList转换成List或者Set类型,直接传给setParameter就行,JPA会自动帮你处理成正确的IN子句格式。示例代码:// 先把你的字符串转换成集合(如果原本就是集合直接用就行) List<String> codeList = Arrays.asList("123", "456"); // 编写原生SQL,IN里用占位符:codeList String sql = "SELECT * FROM your_table WHERE code IN (:codeList)"; // 创建查询并设置参数 Query query = entityManager.createNativeQuery(sql); query.setParameter("codeList", codeList); // 获取结果 List<Object[]> result = query.getResultList();执行后,SQL会被自动解析成
SELECT * FROM your_table WHERE code IN ('123','456'),这样就能正确匹配数据了。如果codeList是逗号分隔字符串:先拆分再使用
如果你拿到的codeList是像"123 ,456"这样的字符串,先把它处理成集合再用上面的方法:String codeStr = "123 ,456"; // 拆分字符串,去掉每个元素的空格,转成List List<String> codeList = Arrays.stream(codeStr.split(",")) .map(String::trim) .collect(Collectors.toList()); // 后续步骤和上面的推荐方法一致不推荐的应急方法:用数据库内置函数
如果你暂时没法改参数类型,可以试试数据库的内置函数(比如MySQL的FIND_IN_SET),但要注意这种方法性能差,还可能有兼容性问题:String codeStr = "123 ,456"; String sql = "SELECT * FROM your_table WHERE FIND_IN_SET(code, :codeList) > 0"; Query query = entityManager.createNativeQuery(sql); // 记得去掉字符串里的空格,不然函数识别不了 query.setParameter("codeList", codeStr.replaceAll(" ", "")); List<Object[]> result = query.getResultList();注意:不同数据库的函数不一样,比如Oracle要用
INSTR,所以尽量不用这种方法。
内容的提问来源于stack exchange,提问作者John Joe
相关产品推荐
相关产品推荐

