# xxIfNull 方法使用

# 功能介绍

xxIfNull 系列方法提供了一种便捷的方式来处理条件查询中的空值情况。当值为空时,对应的条件不会被添加到查询语句中。

# 支持的方法

目前支持以下方法:

  • eqIfNull - 等于(值不为空时)
  • neIfNull - 不等于(值不为空时)
  • gtIfNull - 大于(值不为空时)
  • geIfNull - 大于等于(值不为空时)
  • ltIfNull - 小于(值不为空时)
  • leIfNull - 小于等于(值不为空时)
  • likeIfNull - 模糊查询(值不为空时)
  • notLikeIfNull - 不包含(值不为空时)
  • likeLeftIfNull - 左模糊(值不为空时)
  • likeRightIfNull - 右模糊(值不为空时)
  • notLikeLeftIfNull - 不以什么开头(值不为空时)
  • notLikeRightIfNull - 不以什么结尾(值不为空时)
  • betweenIfNull - 范围查询(两个值都不为空时)
  • notBetweenIfNull - 不在范围内(两个值都不为空时)

# 使用示例

// 构建查询条件
wrapper.eqIfNull(User::getStatus, status)           // status不为空时才会加入条件
       .likeIfNull(User::getName, name)             // name不为空时才会加入条件
       .betweenIfNull(User::getAge, minAge, maxAge) // minAge和maxAge都不为空时才会加入条件
       .geIfNull(User::getCreateTime, startTime);   // startTime不为空时才会加入条件

// 等价于以下代码
wrapper.eq(ObjectUtils.isNotEmpty(status), User::getStatus, status)
       .like(ObjectUtils.isNotEmpty(name), User::getName, name)
       .between(ObjectUtils.isNotEmpty(minAge) && ObjectUtils.isNotEmpty(maxAge), User::getAge, minAge, maxAge)
       .ge(ObjectUtils.isNotEmpty(startTime), User::getCreateTime, startTime);

# 实际应用场景

  1. 处理搜索表单
public List<User> searchUsers(UserQuery query) {
    return Joins.of(User.class)
            .eqIfNull(User::getGender, query.getGender())
            .likeIfNull(User::getName, query.getName())
            .likeIfNull(User::getEmail, query.getEmail())
            .geIfNull(User::getCreateTime, query.getStartTime())
            .leIfNull(User::getCreateTime, query.getEndTime())
            .list();
}
  1. 动态查询条件
wrapper.eqIfNull(User::getStatus, status)    // 状态条件
       .likeIfNull(User::getName, keyword)    // 关键字搜索
       .inIfNull(User::getType, typeList);    // 类型过滤

# 注意事项

  1. 空值判断
  • 使用 ObjectUtils.isNotEmpty() 进行判断
  • null、空字符串、空集合都被视为空值
  • 数值类型的 0 不被视为空值
  1. 使用建议
  • 适合处理可选查询参数
  • 可以减少代码中的显式判空逻辑
  • 建议在查询条件比较多的场景使用
  1. 性能考虑
  • 空值条件不会加入SQL,可以提高查询效率
  • 减少了无效条件的拼接