如何在带参数的Infinispan查询中使用'in'运算符?
问题原因
Infinispan 12.1.7版本使用的Ickle查询语法对IN子句的参数绑定存在特定限制,你遇到的两个报错分别对应语法规则、参数类型兼容问题:
- 首次报
':'不允许使用:是因为该版本Ickle语法要求IN子句后的命名参数必须包裹在括号内,不支持in :参数名的裸写格式 - 调整后报
java.util.Arrays$ArrayList cannot be cast to java.lang.Comparable:是因为框架没有对Arrays.asList()生成的固定长度集合类做兼容处理,会误将集合整体识别为单值字段尝试做类型转换,导致转型失败
解决方案
按以下两步调整代码即可正常执行查询:
- 保留带括号的IN参数语法:
Query<Foo> query = qf.create("from com.test.app.Foo where id in (:ids)");
- 将传入的集合参数转换为标准
java.util.ArrayList类型后再绑定,不要直接传入Arrays.asList()生成的集合、不可变集合:
// 转换原有集合为标准ArrayList List<String> standardIds = new ArrayList<>(idsArrayList); query.setParameter("ids", standardIds);
如果查询的集合元素数量小于等于500,该写法的查询性能没有明显问题,不需要额外调整。
内容的提问来源于stack exchange,提问作者Noy Gafni
相关产品推荐
相关产品推荐

