news 2026/6/9 3:19:57

告别 if 地狱:Spring Boot 3 + QueryDSL 优雅实现动态分页查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别 if 地狱:Spring Boot 3 + QueryDSL 优雅实现动态分页查询

简介

QueryDSL插件不由Spring官方提供,而是一个独立的开源项目。不过Spring生态(Spring Data JPA)提供了对QueryDSL良好集成支持。QueryDSL 是一款用于构建类型安全的 SQL/JPQL 查询的开源框架。它通过纯Java API的方式,让开发者能够以面向对象的方式来构建数据库查询,从而替代传统的字符串拼接 SQL 或复杂的 Criteria API。
形象地举个例子,普通编写查询需要编写一大堆where条件语句,而且必须适应不同的查询条件搭配,比如一张表中包括:年龄、用户名、生日、邮箱、电话号,有的使用者喜欢以生日加姓名查询,而有的使用者喜欢以邮箱加电话号查询,可见在用户需求中查询条件组合多种多样,无论是使用Mybatis还是spring data jpa,在不使用QueryDSL的前提下,需要在mapper.xmlrepository中的SQL中写入大量查询语句,这显然非常繁琐。而QueryDSL正是为解决此问题而生。本文基于springboot 3.0记述使用方式。

pom.xml引入

<!-- QueryDSL依赖 --><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId><version>5.0.0</version><classifier>jakarta</classifier></dependency><dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><version>5.0.0</version><classifier>jakarta</classifier><scope>provided</scope></dependency>...<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><version>5.0.0</version><classifier>jakarta</classifier></path><path><groupId>jakarta.persistence</groupId><artifactId>jakarta.persistence-api</artifactId><version>3.1.0</version></path></annotationProcessorPaths></configuration></plugin>

然后执行:mvn clean compile,最后在项目的target/generated-sources/annotations路径下找到以Q+entity名称的java类

Repository 怎么写?

继承QuerydslPredicateExecutor类

packagecn.train.repository;importcn.train.entity.Users;importorg.springframework.data.jpa.repository.JpaRepository;importorg.springframework.data.querydsl.QuerydslPredicateExecutor;importorg.springframework.stereotype.Repository;importjava.util.UUID;@RepositorypublicinterfaceUsersRepositoryextendsJpaRepository<Users,UUID>,QuerydslPredicateExecutor<Users>{}

查询条件怎么装?

一共分3步走,我们一步一步讲解

第一步:创建一个Query类

这个得自己创建,没法自动生成,用于接收前端传入的查询条件

@DatapublicclassUserQuery{privateStringusername;privateStringsex;privateDatebirthdayStart;privateDatebirthdayEnd;}

第二步:Service 里拼条件,顺便把分页加进去

publicPage<Users>queryAll(UserQueryquery,PageRequestpageRequest){QUsersu=QUsers.users;BooleanBuilderwhere=newBooleanBuilder();if(q.getUsername()!=null){where.and(u.username.contains(q.getUsername()));}if(q.getSex()!=null){where.and(u.sex.eq(q.getSex()));}if(q.getBirthdayStart()!=null&&q.getBirthdayEnd()!=null){where.and(u.birthday.between(q.getBirthdayStart(),q.getBirthdayEnd()));}// 加入分页Page<Users>page=usersRepository.findAll(where,pageRequest);returnpage;}

第三步:controller接前台传入的条件

@GetMapping("/query")publicResponseEntity<Page<Users>>query(@RequestParam(defaultValue="1")intpage,@RequestParam(defaultValue="10")intsize,UserQueryuserQuery// 这里特别注意不能写@RequestParam){returnResponseEntity.ok(usersService.queryAll(userQuery,PageRequest.of(page-1,size)));}

最后前台以/query?username=admin&sex=男&page=1&size=10类似格式传入查询即可

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 3:18:18

3步打造专属AI音色:RVC WebUI模型融合实战指南

3步打造专属AI音色&#xff1a;RVC WebUI模型融合实战指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-Web…

作者头像 李华
网站建设 2026/6/9 3:16:37

51单片机+Proteus超声波测距:从公式推导到代码实现的保姆级复盘(含定时器配置详解)

51单片机超声波测距全流程深度解析&#xff1a;从物理原理到Proteus仿真优化超声波测距技术作为嵌入式系统中的经典应用&#xff0c;其背后蕴含着丰富的物理原理和硬件交互逻辑。本文将带您从声波传播的基础物理公式出发&#xff0c;逐步拆解51单片机实现超声波测距的完整技术链…

作者头像 李华
网站建设 2026/6/9 3:13:42

我在秒杀系统上踩过的3个大坑,设计时千万注意

专栏导读&#xff1a;Spring Boot 3.x 企业级实战&#xff1a;从零到offer的完整路径&#xff0c;共7天带你从入门到精通。已发布7篇。 天数文章标题状态第1天Spring Boot 3.x 生产环境配置管理实战&#xff1a;别再用application.properties踩坑了已发布第2天Spring Boot 3.x …

作者头像 李华
网站建设 2026/6/9 3:07:29

我当了一周CSDN会员体验官,说点大家不爱听的大实话

活动页面那些花里胡哨的宣传语我就不复读了&#xff0c;直接开门见山。我这次拿到的是7天免费试用&#xff0c;五个核心功能挨个测了一遍。不吹不黑&#xff0c;好就是好&#xff0c;烂就是烂&#xff0c;下面挨个说。一、多平台账号一键分发&#xff1a;省时间是真&#xff0c…

作者头像 李华