A.-? 2024-05-02 06:40 采纳率: 68.4%
浏览 117
已结题

mybatisplus-LambdaQueryWrapper组装sql异常

java8使用LambdaQueryWrapper组装sql发生异常

代码如图

img

错误信息
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.NullPointerException: Cannot invoke "Object.hashCode()" because "key" is null]

Caused by: 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.NullPointerException: Cannot invoke "Object.hashCode()" because "key" is null]

Caused by: org.apache.ibatis.ognl.OgnlException: sqlSegment

Caused by: java.lang.NullPointerException: Cannot invoke "Object.hashCode()" because "key" is null

  • 写回答

5条回答 默认 最新

  • 专家-皆知 2024-05-02 06:40
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    看起来你在使用MyBatisPlus的LambdaQueryWrapper时遇到了一个NullPointerException。这个错误通常是因为在尝试访问null对象的方法时发生的。根据错误信息,问题可能出在Ognl表达式的评估上。

    为了修复这个问题,首先确保所有用于构建查询的属性值都不为null。然后,检查一下LambdaQueryWrapper的链式调用是否正确。这里有一个修改后的示例代码,针对你提供的代码进行了优化:

    import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    
    // 假设AgtOrder和startDate、endDate、val是正确的类型
    List<AgtOrder> result;
    
    // 创建一个新的Page对象,用于分页查询(如果你不需要分页,可以忽略这一步)
    IPage<AgtOrder> page = new Page<>(1, 10); // 第一页,每页10条记录
    
    // 初始化LambdaQueryWrapper
    LambdaQueryWrapper<AgtOrder> agtorderLambdaQueryWrapper = new LambdaQueryWrapper<>();
    
    // 链式操作,添加条件
    agtorderLambdaQueryWrapper
        .eq(AgtOrder::getAmount, val)
        .eq(AgtOrder::getAccType, val)
        .ge(AgtOrder::getCreateTime, startDate)
        .lt(AgtOrder::getCreateTime, endDate);
    
    // 使用when方法处理or条件,防止null值导致的NullPointerException
    agtorderLambdaQueryWrapper.when(!Objects.isNull(val), () -> {
        agtorderLambdaQueryWrapper
            .or()
                .eq(AgtOrder::getOutAuthNo, val)
                .or().eq(AgtOrder::getOutAuthNo, "3");
    });
    
    // 执行查询
    result = yourMapper.selectList(agtorderLambdaQueryWrapper.groupBy(AgtOrder::getFieldToGroupBy)); // 替换fieldToGroupBy为实际需要分组的字段名
    
    // 如果有分页需求,执行分页查询
    if (page.getPagesize() > 0) {
        IPage<AgtOrder> pagedResult = yourMapper.selectPage(page, agtorderLambdaQueryWrapper);
        result = pagedResult.getRecords();
    }
    

    这段代码做了以下改进:

    1. 添加了对val变量非空的检查。
    2. 使用了when()方法处理or条件,这样当val为null时,不会执行后续的操作。
    3. 将最后一个and操作替换为一个单独的when语句,以避免潜在的null引用异常。
    4. 如果你需要分页查询,记得使用selectPage方法,并提供一个初始的Page对象。

    确保你的实体类AgtOrder中的字段名称与代码中的匹配,例如getAmountgetAccType等。如果在运行这段代码后仍然出现问题,请检查其他可能的null值来源。

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 专家已采纳回答 5月6日
  • 创建了问题 5月2日