1 主要区别
1.1 引用方式不同
- QueryWrapper 使用字符串表示字段名:
.eq("name", value)
- LambdaQueryWrapper 用 Lambda 表达式引用字段:
.eq(User::getName, value)
类型安全
- LambdaQueryWrapper类型安全,编译期可检查字段是否存在
- QueryWrapper用字符串,易拼写错误且编译期无法检测
重构友好性
- 使用 LambdaQueryWrapper ,若修改实体类字段名,IDE 会提示重构所有引用
- QueryWrapper 使用的字符串不会自动跟随类字段变更而更新
2 使用示例
QueryWrapper 用法:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "张三")
.gt("age", 18)
.like("email", "test");
LambdaQueryWrapper 用法:
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "张三")
.gt(User::getAge, 18)
.like(User::getEmail, "test");
3 建议
- 推荐使用 LambdaQueryWrapper,因为它类型安全,减少拼写错误引起的问题
- 在重构时,LambdaQueryWrapper 更有优势,字段变更会自动关联到引用处
- 如果需要使用动态列名或数据库原生语法,则 QueryWrapper 更灵活