在单表查询时经常会遇到一对多的查询,也就是会使用 in 去进行另一个表的信息查询。此时你是否会使用
if
条件判断 或者三元运算符
去处理可能空集合参数的情况?从而避免程序异常的抛出。在使用Mybatis Plus
时,有没有更加优雅的去处理以上问题呢?我的做法是封装一个Optionals
类,类似于Optional
类进行空的处理并设置了默认值。
示例:
一个用户(t_sys_user)多个角色(t_sys_role),通过用户中间表(t_sys_user_role)进行关系映射。
查询语句如下:
User user = new User();
// 获取用户多个角色编号
SFunction<UserRole, Long> selectColumns = UserRole::getRoleId;
List<UserRole> userRoles = userRoleService.list(Wrappers.<UserRole>lambdaQuery().select(selectColumns).eq(UserRole::getId, user.getId()));
Set<Long> roleIds = Lambdas.convertSet(userRoles, selectColumns);
// 通过角色编号查询角色详细信息
List<Role> roles1 = roleService.listByIds(roleIds); // throw BadSqlGrammarException
List<Role> roles2 = CollUtil.isNotEmpty(roleIds) roleService.listByIds(roleIds) : CollUtil.newArrayList(); // 三元运算符
List<Role> roles3 = Optionals.of(roleIds).apply(roleService::listByIds); // 自定义工具类,方法应用操作符 ::
Optionals
代码
public class Optionals<T> {
private final Collection<T> value;
private Optionals(Collection<T> value) {
this.value = value;
}
public static <T> Optionals<T> of(Collection<T> value) {
return new Optionals<>(value);
}
public <R> List<R> apply(Function<Collection<T>, List<R>> function) {
return !ObjectUtils.isEmpty(value) function.apply(value) : new ArrayList<>();
}
}
喜欢 Lambdas 工具类的可以戳这里:一个好用的 JAVA 工具类 - JDK 8 Lambda 表达式