// 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 nameLike; // 模糊查询姓名
private String phoneLike; // 模糊查询手机号
}
// 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?nameLike=张&phoneLike=138
在实体类中添加List后缀字段:
public class LawyerUserQuery extends LawyerUser {
private List<Integer> idList; // 批量查询ID
private List<String> statusList; // 批量查询状态
}
// 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?idList=1&idList=2&idList=3
生成的SQL:
WHERE id IN (1, 2, 3)
在实体类中添加Start/End后缀字段:
public class LawyerUserQuery extends LawyerUser {
private Date createdTimeStart; // 创建时间开始
private Date createdTimeEnd; // 创建时间结束
private Integer serviceCountStart; // 服务次数范围开始
private Integer serviceCountEnd; // 服务次数范围结束
}
// 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?createdTimeStart=2025-01-01&createdTimeEnd=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&createdTimeStart=2025-01-01&createdTimeEnd=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) - 设置是否忽略空字符串.ignoreEmptyStr(true) // 默认true,忽略空字符串
.ignoreEmptyStr(false) // 保留空字符串作为查询条件
stringFieldLike(boolean like) - 设置String字段是否默认模糊查询.stringFieldLike(true) // 所有String字段使用模糊查询
.stringFieldLike(false) // 所有String字段使用等值查询(默认)
likeFields(String... fieldNames) - 指定字段使用模糊查询.likeFields("name") // 单个字段
.likeFields("name", "phone") // 多个字段
page(int pageNum, int pageSize) - 设置分页参数.page(1, 10) // 第1页,每页10条
page(Page<T> page) - 设置分页对象Page<LawyerUser> pageObj = new Page<>(1, 10);
.page(pageObj)
build() - 构建查询条件.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 结尾nameLike → 查询 name 字段,使用 LIKE '%value%'Collection(List、Set等)List 结尾(推荐)idList → 查询 id 字段,使用 IN (1,2,3)Start 或 End 结尾xxxStart 和 xxxEndcreatedTimeStart → createdTime >= valuecreatedTimeEnd → createdTime <= valuelikeFields() 方法指定的字段Like 结尾的字段stringFieldLike(true) 时,所有String字段使用模糊查询=)QueryBuilder.of(query)
.stringFieldLike(true) // 全局:所有String字段模糊查询
.likeFields("name") // 指定:name字段模糊查询(优先级更高)
.build()
结果:
name 字段:使用模糊查询(likeFields 优先级更高)stringFieldLike 生效)@Data
public class LawyerUserQuery extends LawyerUser {
// 模糊查询字段(方式一:在代码中指定,不需要在实体类中定义)
// 方式二:使用Like后缀字段
private String nameLike;
private String phoneLike;
// 批量查询字段
private List<Integer> idList;
private List<Integer> statusList;
// 范围查询字段
private Date createdTimeStart;
private Date createdTimeEnd;
private Integer serviceCountStart;
private Integer serviceCountEnd;
}
@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) // 全局模糊查询
// 注意:没有单独排除的方法,可以使用Like后缀字段的方式
// 方式二:只指定需要模糊查询的字段
QueryBuilder.of(query)
.likeFields("name", "phone") // 只指定这些字段模糊查询
.build()
// 在实体类中定义两个字段
public class LawyerUserQuery extends LawyerUser {
private String name; // 等值查询
private String nameLike; // 模糊查询
}
// 使用时
QueryBuilder.of(query)
.build() // name使用等值查询,nameLike使用模糊查询
QueryBuilder.of(query)
.ignoreEmptyStr(false) // 不忽略空字符串
.build()
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后缀字段(更灵活)
// 在实体类中定义 nameLike 字段
QueryBuilder.of(query)
.build()
.list(service);
// ❌ 不推荐:全局String字段模糊查询(可能影响不需要模糊的字段)
QueryBuilder.of(query)
.stringFieldLike(true) // 除非你真的需要所有String字段都模糊
.build()
总结:QueryBuilder 提供了强大而灵活的查询能力,只需要传入对象,就能自动构建各种查询条件,大大简化了开发工作。通过合理使用 likeFields() 和 stringFieldLike() 方法,可以灵活控制模糊查询行为。