首页 > 基础资料 博客日记
QueryDsl动态排序的实现
2025-07-04 21:00:01基础资料围观4726次
本篇文章分享QueryDsl动态排序的实现,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识
写在前面,最近项目持久层框架需要使用JPA+QueryDsl,而网上相关的资料特别少。我将在
JPA
和QueryDsl
标签下记录学习过程中遇到的问题和解决方案,希望能帮到有需要的小伙伴。
本文介绍使用QueryDsl实现动态排序的方法,即前端动态地向后端传递排序字段和排序规则,后端返回相应的结果。
步骤一
在项目的util包下创建一个QueryDslSortUtil
工具类,直接复制粘贴以下代码即可。
public class QueryDslSortUtil {
/**
* 将字段名和排序方向转换成 QueryDSL 的 OrderSpecifier
*
* @param sortField 排序字段名
* @param sortOrder 排序方向 (asc或desc)
* @param pathBase Q类对象(例如QArticle.article)
* @return OrderSpecifier
*/
public static <T> OrderSpecifier<?> buildSort(String sortField, String sortOrder, EntityPathBase<T> pathBase) {
Order order = "asc".equalsIgnoreCase(sortOrder) ? Order.ASC : Order.DESC;
Path<T> path = Expressions.path(pathBase.getType(), pathBase, sortField);
return new OrderSpecifier(order, path);
}
}
步骤二
在Repository中调用QueryDslSortUtil工具类的buildSort方法,到这里就可以正常使用了。示例代码如下。
@Component
public class ArticleAdvancedRepositoryImpl implements ArticleAdvancedRepository {
@Resource
private JPAQueryFactory jpaQueryFactory;
@Override
public Page<ArticleVO> dynamicFindAll(int page, int size, ArticleQueryVO articleQueryVO) {
Pageable pageable = PageUtil.handlePage(page, size); //分页对象
QArticle qArticle = QArticle.article; //这里以Article实体为例,请根据实际情况进行修改
//构建动态排序
OrderSpecifier<?> orderSpecifier = QueryDslSortUtil.buildSort(
articleQueryVO.getSortField().name(), //前端传来的排序字段
articleQueryVO.getSortOrder().name(), //前端传来的排序规则(升序/降序)
qArticle //Article实体对应的Q类对象
);
//主查询
List<ArticleVO> results = jpaQueryFactory.select(...) //省略了投影的字段,请根据实际需要编写
.from(qArticle)
.orderBy(orderSpecifier)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
//以下代码逻辑省略
//...
//计算总行数
Long totalCount = Optional.ofNullable(jpaQueryFactory.select(qArticle.count())
.from(qArticle)
.fetchOne()).orElse(0L);
return new PageImpl<>(results, pageable, totalCount);
}
}
补充
QueryDSL提供了严格的类型检查。return new OrderSpecifier(order, path);
会出现警告,但不影响使用。
如果希望完全消除警告,可以将步骤一的buildSort方法替换成以下代码:
public static <T extends Comparable<? super T>> OrderSpecifier<?> buildSort(String sortField, String sortOrder, EntityPathBase<T> pathBase) {
Order order = "asc".equalsIgnoreCase(sortOrder) ? Order.ASC : Order.DESC;
Path<T> path =Expressions.path(pathBase.getType(), pathBase, sortField);
return new OrderSpecifier<>(order, path);
}
重要: 如果使用上述修改后的buildSort方法,实体类必须要实现Comparable接口,否则无法通过编译。
public class Article implements Comparable<Article>{
//...实体类的属性
@Override
public int compareTo(Article o) {
//...实现比较的逻辑
return 0;
}
}
文章来源:https://www.cnblogs.com/MagicDoge/p/18966365
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- SpringBoot--如何整体读取多个配置属性及其相关操作
- 个人网站一键引入免费开关评论功能 giscus
- Java开发笔记(一百五十五)生成随机数的几种途径
- 榨干 Claude Code 的 16 个实用小技巧(高端玩法,建议收藏!)
- NBA巨星詹姆斯表变老嫂子了?这锅Viggle Ai得背/Ai视频创作/Ai魔性视频创作/Ai优质视频创作
- Java简历、面试、试用期、转正
- 使用Apollo配置中心,**静态字段通过`@Value`的setter方法可以实现热更新**
- vivo Pulsar 万亿级消息处理实践(3)-KoP指标异常修复
- MybatisPlus使用详情
- G1收集器:JVM垃圾回收的新一代王者