问题描述
背景:我的项目使用的是springboot整合mybatis-plus
今天,在学习springboot项目的一个案例时,我把我的项目打jar包后在终端使用java命令执行这个java程序,运行起来也是正常的,但是在访问首页分页查询的时候终端有error日志输出,分页查询的数据也没有正常显示。我就纳闷了,在IDEA工具下面同样的运行这个项目访问分页查询没有问题,怎么打jar包之后访问分页查询就报错了,于是乎就去检查了服务端这个接口。
错误信息
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@327354c1]
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'ew.sqlSegment != null and ew.sqlSegment != '' and ew.nonEmptyOfWhere'. Cause: org.apache.ibatis.ognl.OgnlException: sqlSegment [java.lang.ExceptionInInitializerError] ......
分析过程
看到这个信息,我发现我的代码有个地方跟这个错误信息有点像
LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
lqw.like(book.getType() != null, Book::getType, book.getType());
lqw.like(book.getName() != null, Book::getName, book.getName());
lqw.like(book.getDescription() != null, Book::getDescription, book.getDescription());
这时候,我就意识到可能是因为我的动态条件判断使用了这种方式判断导致出错
问题解决
于是,我把代码改成了这样
LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
lqw.like(Strings.isNotEmpty(book.getType()), Book::getType, book.getType());
lqw.like(Strings.isNotEmpty(book.getName()), Book::getName, book.getName());
lqw.like(Strings.isNotEmpty(book.getDescription()), Book::getDescription, book.getDescription());
好家伙,改了之后重新打jar包之后在终端运行这个jar再访问分页查询就不报错了。
疑惑
问题是解决了,但是这为啥改了这三句话就能正常运行我还是不理解,有大佬知道吗,求解惑🤔