Hibernate向SELECT IN()子句传递数据列表报错该如何解决?
问题原因
你遇到的类型转换报错是Hibernate参数绑定逻辑导致的:
idproduct是Integer类型字段,HQL的IN子句使用参数绑定时,你传入的是拼接好的逗号分隔字符串"21,22,23...",Hibernate会尝试把这个完整字符串转换为Integer类型匹配字段类型,自然抛出类型转换异常。- 你手动把ID写死在HQL里能正常运行,是因为写死的内容是直接拼接到SQL语句中,被解析为多个独立的整数,不属于参数绑定的处理范畴。
- 你拼接字符串的操作完全没有必要,Hibernate原生支持给
IN子句传递集合类型参数,不需要自己手动拼接ID串。
解决方法
直接提取传入商品列表的ID为Integer集合,使用Hibernate提供的setParameterList方法绑定IN参数即可,修正后的代码如下:
public List<Product> getProductsByIDList(List<Product> list, Session session) { // 直接提取ID集合,不需要手动拼接字符串 List<Integer> productIdList = list.stream() .map(Product::getIdproduct) .toList(); // JDK16以下版本替换为.collect(Collectors.toList()) Query query = session.createQuery("select p from Product p \n" + "join fetch p.sparePart sp\n" + "join fetch p.vehicleModel v\n" + "WHERE p.idproduct IN ( :plist )"); // 注意用setParameterList而不是setParameter绑定集合参数 query.setParameterList("plist", productIdList); List<Product> finalList = (List<Product>) query.list(); return finalList; }
注意:不要自己拼接ID串到HQL中,不仅会有SQL注入风险,当ID数量较多时也容易超出SQL语句长度限制,使用
setParameterList是Hibernate处理IN查询的标准方案。
内容的提问来源于stack exchange,提问作者PeakGen
相关产品推荐
相关产品推荐

