如何将指定多表关联SQL语句转换为QueryDSL形式?
SQL转QueryDSL实现
前提说明
假设已通过QueryDSL生成对应实体类:QLibraryAdmin、QUser、QLibrary、QLendRecord
实现代码
// 初始化QueryDSL实体实例 QLibraryAdmin la = QLibraryAdmin.libraryAdmin; QUser user = QUser.user; QLibrary library = QLibrary.library; QLendRecord lrSub = QLendRecord.lendRecord; // 构建子查询:统计已批准借阅记录中各管理员的处理数量 JPASubQuery<Tuple> subQuery = new JPASubQuery<>(); subQuery.select( lrSub.lendAdminId, lrSub.lendAdminId.count().as("coun") ) .from(lrSub) .groupBy(lrSub.applyStatus, lrSub.lendAdminId) .having(lrSub.applyStatus.eq("APPROVED")); // 主查询逻辑 JPAQuery<Tuple> query = new JPAQuery<>(entityManager); List<Tuple> result = query.select( user.name, la.libraryId, library.libraryName, subQuery.get(lrSub.lendAdminId.count().as("coun")) ) .from(la) .leftJoin(user).on(la.userId.eq(user.id)) .leftJoin(library).on(la.libraryId.eq(library.id)) .leftJoin(subQuery, QTuple.tuple) .on(QTuple.tuple.get(lrSub.lendAdminId).eq(la.userId)) .orderBy(la.libraryId.asc()) .fetch();
补充说明
- 若需要将结果映射为自定义DTO,可替换
select中的字段为DTOConstructorExpression,通过构造函数直接注入属性 - 子查询的关联逻辑完全对应原SQL的分组、过滤规则,确保统计结果一致
内容的提问来源于stack exchange,提问作者Rulong Ma
相关产品推荐
相关产品推荐

