问题场景:
提供的一个模糊查询的接口报错
报错信息:"数据访问错误: Operand of 'like' is of type 'java.lang.Object' which is not a string (it is not an instance of 'java.lang.String' or 'char[]')"
问题描述
之前提供的一个模糊查询的一个接口报错,异常信息如上。关键该接口之前是正常的。
核心代码:
default Page<DomeEntity> findAll(List<String> list, Pageable pageable) {
return this.findAll((root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (!list.isEmpty()) {
List<Predicate> p1 = new ArrayList<>();
for (String i : list) {
p1.add(cb.like(root.get("test"), "%" + i + "%"));
}
Predicate[] parr = new Predicate[labels.size()];
predicates.add(cb.or(p1.toArray(parr)));
}
Predicate[] pre = new Predicate[predicates.size()];
return query.where(predicates.toArray(pre)).getRestriction();
}, pageable);
}
原因分析:
因为这种查询,我们几乎每个项目都有提供,一开始是以为代码写法出了问题,后来找到能正常查询的代码进行比对,发现几乎一样。
因为是 jpa 的 orm,所以一开始以为是 jpa 的版本更新导致的,后来发现确实是依赖版本不一致导致的,只是我第一次更换的依赖不是引起问题的依赖;起先我只是将 jpa 相关的依赖移植到查询 ok 的项目中,但是发现问题没有复现,阿西吧!后续中午休息一会,接着看问题,最终发现该报错的对象虽然属于 jpa,但是他是 jpa 的子依赖,也就是 hibernate-core,最后我将他的版本回退后,一切问题都没有了,焯!
解决方案:
只需要将依赖回退到 6.2.5.Final 版本即可,因为我没有具体测试是升级到那个版本才会出现这个报错,所以大家可以先直接使用该版本解决。
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.2.5.Final</version>
</dependency>
结论:
我现在明白为什么 jdk 大家还是偏爱 8 了,哈哈,又水了一篇