hibernate-core升级后导致的BUG

95 阅读1分钟

003147-168961150720fc.jpg

问题场景:

提供的一个模糊查询的接口报错

报错信息:"数据访问错误: 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 了,哈哈,又水了一篇