1. listObjs()
的作用
listObjs()
是 MyBatis-Plus 提供的一个特殊查询方法,用于:
-
只查询单列数据 (比如只查
user_id
这一列) -
自动将结果转换为指定类型 (如
Long
、String
等) -
queryWrapper
:已经设置了select(Follow::getUserId)
,表示只查user_id
列 -
obj -> (Long) obj
:将查询到的user_id
值强制转换为Long
类型
我来详细解释 listObjs()
的用法,并用最简单的方式教你如何使用它。
1. listObjs()
的作用
listObjs()
是 MyBatis-Plus 提供的一个特殊查询方法,用于:
- 只查询单列数据 (比如只查
user_id
这一列) - 自动将结果转换为指定类型 (如
Long
、String
等)
2. 你的代码解析
kotlin
List<Long> followerIds = followService.listObjs(
queryWrapper, // 查询条件
obj -> (Long) obj // 结果转换函数(将Object转为Long)
);
-
queryWrapper
:已经设置了select(Follow::getUserId)
,表示只查user_id
列 -
obj -> (Long) obj
:将查询到的user_id
值强制转换为Long
类型
3. 分步拆解(完全等价写法)
如果你觉得 Lambda 表达式难以理解,可以拆解成这样:
ini
java
复制
// 1. 执行查询,获取Object类型的结果列表
List<Object> rawResults = followService.listObjs(queryWrapper);
// 2. 手动转换为Long类型
List<Long> followerIds = new ArrayList<>();
for (Object obj : rawResults) {
followerIds.add((Long) obj);
}
4. 实际场景示例
假设有一个 follow
表,结构如下:
id | user_id | follow_user_id |
---|---|---|
1 | 100 | 200 |
2 | 101 | 200 |
你想查询 follow_user_id = 200
的所有粉丝的 user_id
:
(1) 完整代码
ini
java
复制
// 构建查询条件
LambdaQueryWrapper<Follow> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Follow::getFollowUserId, 200) // WHERE follow_user_id = 200
.select(Follow::getUserId); // 只查 user_id 列
// 执行查询
List<Long> followerIds = followService.listObjs(queryWrapper, obj -> (Long) obj);
// 结果:followerIds = [100, 101]
(2) 如果不用 Lambda
ini
java
复制
QueryWrapper<Follow> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("follow_user_id", 200)
.select("user_id"); // 直接写列名
List<Long> followerIds = followService.listObjs(queryWrapper, obj -> (Long) obj);
5. 常见问题解答
Q1: 为什么不能直接用 list()
?
list()
会返回 完整实体对象列表 (所有字段),但你只需要user_id
这一列,用listObjs()
更高效。
Q2: 如果查询多列怎么办?
-
listObjs()
只能查单列,多列查询请用listMaps()
:javascriptqueryWrapper.select("user_id", "create_time"); List<Map<String, Object>> result = followService.listMaps(queryWrapper);
最推荐写法
perlList<Long> followerIds = followService.listObjs( Wrapper.<Follow>query() .eq("follow_user_id",200) .select("user_id"), obj -> (Long) obj );