// Controller中
@GetMapping("/getList")
public R<List<LawyerUser>> getList(@ModelAttribute LawyerUser query) {
List<LawyerUser> list = QueryBuilder.of(query)
.build()
.list(lawyerUserService);
return R.data(list);
}
请求示例:
GET /lawyer/user/getList?name=张三&status=1
说明:
=)@GetMapping("/getPage")
public R<IPage<LawyerUser>> getPage(
@ModelAttribute LawyerUser query,
@RequestParam(defaultValue = "1") int pageNum,
@RequestParam(defaultValue = "10") int pageSize) {
IPage<LawyerUser> page = QueryBuilder.of(query)
.page(pageNum, pageSize) // 设置分页
.build()
.page(lawyerUserService); // 执行分页查询
return R.data(page);
}
@GetMapping("/search")
public R<List<LawyerUser>> search(@ModelAttribute LawyerUser query) {
List<LawyerUser> list = QueryBuilder.of(query)
.likeFields("name", "phone") // 指定 name 和 phone 字段使用模糊查询
.build()
.list(lawyerUserService);
return R.data(list);
}
请求示例:
GET /lawyer/user/search?name=张&phone=138
生成的SQL:
WHERE name LIKE '%张%' AND phone LIKE '%138%'
@GetMapping("/search")
public R<List<LawyerUser>> search(@ModelAttribute LawyerUser query) {
List<LawyerUser> list = QueryBuilder.of(query)
.stringFieldLike(true) // 所有String类型字段都使用模糊查询
.build()
.list(lawyerUserService);
return R.data(list);
}
在实体类中添加_Like后缀字段(仅用于查询,不需要对应数据库字段):
// 查询实体类(继承基础实体类)
public class LawyerUserQuery extends LawyerUser {
private String name_Like; // 模糊查询姓名
private String phone_Like; // 模糊查询手机号
}
// Controller中
@GetMapping("/search")
public R<List<LawyerUser>> search(@ModelAttribute LawyerUserQuery query) {
List<LawyerUser> list = QueryBuilder.of(query)
.build()
.list(lawyerUserService);
return R.data(list);
}
请求示例:
GET /lawyer/user/search?name_Like=张&phone_Like=138
在实体类中添加_List后缀字段:
// 查询实体类(继承基础实体类)
public class LawyerUserQuery extends LawyerUser {
private List<Integer> id_List; // 批量查询ID
private List<String> status_List; // 批量查询状态
}
// Controller中
@GetMapping("/getByIds")
public R<List<LawyerUser>> getByIds(@ModelAttribute LawyerUserQuery query) {
List<LawyerUser> list = QueryBuilder.of(query)
.build()
.list(lawyerUserService);
return R.data(list);
}
请求示例:
GET /lawyer/user/getByIds?id_List=1&id_List=2&id_List=3
生成的SQL:
WHERE id IN (1, 2, 3)
在实体类中添加_Start/_End后缀字段:
// 查询实体类(继承基础实体类)
public class LawyerUserQuery extends LawyerUser {
private Date createdTime_Start; // 创建时间开始
private Date createdTime_End; // 创建时间结束
private Integer serviceCount_Start; // 服务次数范围开始
private Integer serviceCount_End; // 服务次数范围结束
}
// Controller中
@GetMapping("/getByTimeRange")
public R<List<LawyerUser>> getByTimeRange(@ModelAttribute LawyerUserQuery query) {
List<LawyerUser> list = QueryBuilder.of(query)
.build()
.list(lawyerUserService);
return R.data(list);
}
请求示例:
GET /lawyer/user/getByTimeRange?createdTime_Start=2025-01-01&createdTime_End=2025-01-31
生成的SQL:
WHERE created_time >= '2025-01-01' AND created_time <= '2025-01-31'
@GetMapping("/complexQuery")
public R<IPage<LawyerUser>> complexQuery(
@ModelAttribute LawyerUserQuery query,
@RequestParam(defaultValue = "1") int pageNum,
@RequestParam(defaultValue = "10") int pageSize) {
IPage<LawyerUser> page = QueryBuilder.of(query)
.page(pageNum, pageSize) // 分页
.likeFields("name", "phone") // 指定字段模糊查询
.ignoreEmptyStr(true) // 忽略空字符串(默认true)
.build()
.page(lawyerUserService);
return R.data(page);
}
请求示例:
GET /lawyer/user/complexQuery?name=张&phone=138&status=1&createdTime_Start=2025-01-01&createdTime_End=2025-01-31&pageNum=1&pageSize=10
生成的SQL:
WHERE name LIKE '%张%'
AND phone LIKE '%138%'
AND status = 1
AND created_time >= '2025-01-01'
AND created_time <= '2025-01-31'
LIMIT 10 OFFSET 0
of(T queryEntity) - 创建查询构建器QueryBuilder.of(queryEntity)
ignoreEmptyStr(boolean ignore) - 设置是否忽略空字符串QueryBuilder.of(query)
.ignoreEmptyStr(true) // 默认true,忽略空字符串
.build()
.list(service);
QueryBuilder.of(query)
.ignoreEmptyStr(false) // 保留空字符串作为查询条件
.build()
.list(service);
stringFieldLike(boolean like) - 设置String字段是否默认模糊查询QueryBuilder.of(query)
.stringFieldLike(true) // 所有String字段使用模糊查询
.build()
.list(service);
QueryBuilder.of(query)
.stringFieldLike(false) // 所有String字段使用等值查询(默认)
.build()
.list(service);
likeFields(String... fieldNames) - 指定字段使用模糊查询QueryBuilder.of(query)
.likeFields("name") // 单个字段
.build()
.list(service);
QueryBuilder.of(query)
.likeFields("name", "phone") // 多个字段
.build()
.list(service);
page(int pageNum, int pageSize) - 设置分页参数QueryBuilder.of(query)
.page(1, 10) // 第1页,每页10条
.build()
.page(service);
page(Page<T> page) - 设置分页对象Page<LawyerUser> pageObj = new Page<>(1, 10);
QueryBuilder.of(query)
.page(pageObj)
.build()
.page(service);
build() - 构建查询条件QueryResult<LawyerUser> result = QueryBuilder.of(query)
.build(); // 返回 QueryResult 对象
list(IService<T> service) - 列表查询List<LawyerUser> list = builder.build().list(lawyerUserService);
page(IService<T> service) - 分页查询IPage<LawyerUser> page = builder.page(1, 10).build().page(lawyerUserService);
one(IService<T> service) - 单条查询LawyerUser user = builder.build().one(lawyerUserService);
count(IService<T> service) - 计数查询long count = builder.build().count(lawyerUserService);
getWrapper() - 获取查询条件(用于调试)QueryWrapper<LawyerUser> wrapper = builder.build().getWrapper();
System.out.println(wrapper.getTargetSql()); // 打印SQL
方式一:使用 likeFields 方法指定
.likeFields("name", "phone") // 在代码中指定
方式二:字段名以 _Like 结尾
_Like 结尾name_Like → 查询 name 字段,使用 LIKE '%value%'Collection(List、Set等)_List 结尾(推荐)id_List → 查询 id 字段,使用 IN (1,2,3)_Start 或 _End 结尾xxx_Start 和 xxx_EndcreatedTime_Start → createdTime >= valuecreatedTime_End → createdTime <= valuelikeFields() 方法指定的字段_Like 结尾的字段stringFieldLike(true) 时,所有String字段使用模糊查询=)QueryBuilder.of(query)
.stringFieldLike(true) // 全局:所有String字段模糊查询
.likeFields("name") // 指定:name字段模糊查询(优先级更高)
.build()
.list(service);
结果:
name 字段:使用模糊查询(likeFields 优先级更高)stringFieldLike 生效)import java.util.Date;
import java.util.List;
import lombok.Data;
@Data
public class LawyerUserQuery extends LawyerUser {
// 模糊查询字段(方式一:在代码中指定,不需要在实体类中定义)
// 方式二:使用_Like后缀字段
private String name_Like;
private String phone_Like;
// 批量查询字段
private List<Integer> id_List;
private List<Integer> status_List;
// 范围查询字段
private Date createdTime_Start;
private Date createdTime_End;
private Integer serviceCount_Start;
private Integer serviceCount_End;
}
import org.springframework.web.bind.annotation.*;
import lombok.RequiredArgsConstructor;
import com.baomidou.mybatisplus.core.metadata.IPage;
@RestController
@RequestMapping("/lawyer/user")
@RequiredArgsConstructor
public class LawyerUserController {
private final LawyerUserService lawyerUserService;
/**
* 通用查询接口(支持所有查询方式)
*/
@GetMapping("/query")
public R<IPage<LawyerUser>> query(
@ModelAttribute LawyerUserQuery query,
@RequestParam(defaultValue = "1") int pageNum,
@RequestParam(defaultValue = "10") int pageSize) {
IPage<LawyerUser> page = QueryBuilder.of(query)
.page(pageNum, pageSize)
.likeFields("name", "phone") // 指定字段模糊查询
.build()
.page(lawyerUserService);
return R.data(page);
}
/**
* 简单查询(只使用等值查询)
*/
@GetMapping("/simple")
public R<List<LawyerUser>> simple(@ModelAttribute LawyerUser query) {
List<LawyerUser> list = QueryBuilder.of(query)
.build()
.list(lawyerUserService);
return R.data(list);
}
/**
* 全局模糊查询(所有String字段都模糊查询)
*/
@GetMapping("/search")
public R<List<LawyerUser>> search(@ModelAttribute LawyerUser query) {
List<LawyerUser> list = QueryBuilder.of(query)
.stringFieldLike(true) // 所有String字段模糊查询
.build()
.list(lawyerUserService);
return R.data(list);
}
}
static)、transient字段(transient)@TableField(exist = false) 标记的字段null)、空字符串(如果启用 ignoreEmptyStr)@TableField 注解的 value 属性userName → user_name)java.util.Date、java.sql.Date、LocalDate、LocalDateTime// 方式一:使用全局模糊查询,然后排除特定字段
QueryBuilder.of(query)
.stringFieldLike(true) // 全局模糊查询
.build()
.list(service);
// 注意:没有单独排除的方法,可以使用Like后缀字段的方式
// 方式二:只指定需要模糊查询的字段
QueryBuilder.of(query)
.likeFields("name", "phone") // 只指定这些字段模糊查询
.build()
.list(service);
// 在实体类中定义两个字段
// 查询实体类(继承基础实体类)
public class LawyerUserQuery extends LawyerUser {
private String name; // 等值查询
private String name_Like; // 模糊查询
}
// 使用时
QueryBuilder.of(query)
.build() // name使用等值查询,name_Like使用模糊查询
.list(service);
QueryBuilder.of(query)
.ignoreEmptyStr(false) // 不忽略空字符串
.build()
.list(service);
QueryResult<LawyerUser> result = QueryBuilder.of(query).build();
QueryWrapper<LawyerUser> wrapper = result.getWrapper();
System.out.println(wrapper.getTargetSql()); // 打印SQL语句
// ✅ 推荐:指定字段模糊查询
QueryBuilder.of(query)
.likeFields("name", "phone")
.build()
.list(service);
// ✅ 推荐:使用_Like后缀字段(更灵活)
// 在实体类中定义 name_Like 字段
QueryBuilder.of(query)
.build()
.list(service);
// ❌ 不推荐:全局String字段模糊查询(可能影响不需要模糊的字段)
QueryBuilder.of(query)
.stringFieldLike(true) // 除非你真的需要所有String字段都模糊
.build()
.list(service);
总结:QueryBuilder 提供了强大而灵活的查询能力,只需要传入对象,就能自动构建各种查询条件,大大简化了开发工作。通过合理使用 likeFields() 和 stringFieldLike() 方法,可以灵活控制模糊查询行为。