hibernate-core升级后导致的BUG

文章讲述了开发者遇到的模糊查询接口报错,经排查发现是由于JPAHibernate核心依赖版本不一致引起的,解决方案是将hibernate-core版本回退到6.2.5.Final。作者借此反思了Java版本选择的重要性。

在这里插入图片描述

问题场景:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值