You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定多表关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:43:18