mybatis-plus的listObjs方法返回指定字段的集合
mybatis-plus的listObjs方法返回指定字段的集合
使用listObjs
示例代码
返回字符串的集合
LambdaQueryWrapper<AdSensitive> query = new LambdaQueryWrapper<AdSensitive>()
.select(AdSensitive::getSensitives);
//记忆
List<String> words = adSensitiveService.listObjs(query, Object::toString);
mybatis-plus的listObjs()源码
/**
* 根据 Wrapper 条件,查询全部记录
*
* @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
* @param mapper 转换函数
*/
default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
return getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
}
注意
Function的泛型,要么是Object,要不就是Object的父类,所有入参一定是Object
/**
* 根据 Wrapper 条件,查询全部记录
* <p>注意: 只返回第一个字段的值</p>
*
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
限定listObjs的wrapper只能返回一个字段,且返回类型指定为Object
实际应用
返回Long类型的集合
List<Long> ids = this.listObjs(
new LambdaQueryWrapper<AdUser>()
.select(AdUser::getId)
.eq(AdUser::getStatus, 1), o -> Long.valueOf(o.toString()));
因为function的入参只能是Object类型,所有参数只能调用Object的toString方法转成字符串,再调用Long的valueOf方法转成Long类型
mybatis-plus的listObjs()原理演示
/**
* mybatis-plus的listObjs()原理演示
*/
@Test
public void test2(){
List<Dto> list = new ArrayList<>();
Dto d1 = new Dto();
d1.setId(1);
d1.setName("java");
list.add(d1);
Dto d2 = new Dto();
d2.setName("php");
list.add(d2);
//相当于getBaseMapper().selectObjs(queryWrapper),
// 从数据源中查询id的集合,类型用Object,而不再用LambdaQueryWrapper中的泛型接收了
//select id from table;
List<Object> objects = list
.stream()
.map(Dto::getId)
.collect(Collectors.toList());
List<Integer> collect = objects
.stream()
.filter(Objects::nonNull)
//因为元素是Object,所以只能调用Object的方法
.map(o->Integer.valueOf(o.toString()))
.collect(Collectors.toList());
System.out.println(collect);
//[1]
}
参考资料地址1:
MybatisPlus:泛型方法使用 default <V> List<V> listObjs(Function<? super Object, V> mapper)