1.先写结论:
1.为了确保 SQL 查询只返回一条记录(当查询返回多条时会报错->多为代码本身问题)。
2.防止数据库执行全表扫描
3.参考网址:问题记录:MyBatis-Plus 中 ServiceImpl 类的 getOne_mybatis_无他&唯手熟尔-2048 AI社区
2.代码
public CardShelfRecord getLastEnableByCardId(String cardId) {QueryWrapper<CardShelfRecord> queryWrapper = new QueryWrapper<>();queryWrapper.eq("cardId", cardId);queryWrapper.isNull("historyCardId");queryWrapper.isNull("endDate");queryWrapper.last("limit 1"); // ⬅️ 这里是关键return this.getOne(queryWrapper);
}
3. last("limit 1")
的作用
.last("limit 1")
是 MyBatis Plus 提供的一个方法,可以向生成的 SQL 语句末尾追加任意字符串,这里是添加了 LIMIT 1
。
SELECT * FROM card_shelf_record
WHERE cardId = 'xxx'AND historyCardId IS NULLAND endDate IS NULL
LIMIT 1;
好处
✅ 性能优化 | 数据库只需要扫描到一条记录即可停止,避免扫描大量数据 |
✅ 防止多条数据导致误判 | 如果不加 LIMIT 1,即使调用 getOne() ,如果查出多条,会抛异常或取第一条,容易引起误解 |