SpringBoot之QueryDsl嵌套子查询问题

 更新时间:2023年03月15日 10:48:47   作者:平静的起步吧  
这篇文章主要介绍了SpringBoot之QueryDsl嵌套子查询问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

QueryDsl嵌套子查询

我项目中要求所有的SQL必须以JPA的QueryDsl格式进行数据库操作,其中有一个稍微复杂点的嵌套子查询,网上资料比较少,而且子查询也特别简单。

费了好大的劲才搞出来,现贴出来供大家参考。

这是MyBatis的查询格式

select dd.crm_province as 省编码,
         dd.province_name as 省份,
         nvl(dd.anncount, 0) as 年化收入,
         nvl(dd.yicansai, 0) as 已参赛人数,
         nvl(ss.weicansai, 0) as 未参赛人数,
         rank() over(order by nvl(dd.anncount, 0) desc)  as 排名
    from (select ll.crm_province,
                 ll.province_name,
                 nvl(sum(ll.annuali_count), 0) anncount,
                 count(distinct ll.staff_id) yicansai
            from tm_match_report_user ll
           where ll.is_close = 1
             and ll.role_id = 00
             and ll.is_login = 1
           group by ll.crm_province, ll.province_name) dd
    left join (select ll.crm_province, count(distinct ll.staff_id) weicansai
                 from tm_match_report_user ll
                where ll.is_close = 1
                  and ll.role_id = 00
                  and ll.is_login = 0
                group by ll.crm_province) ss
      on dd.crm_province = ss.crm_province
   order by dd.anncount desc

这是JPA的QueryDsl格式

 /**
   * 复杂sql查询 -- 双子查询Join
   * @return
   */
  public List<StaffRank> topBind() {
    QMatchReportUser user = new QMatchReportUser("tm_match_report_user");
    QMatchReportUser user1 = new QMatchReportUser("tm_match_report_user");
 
    StringPath dd = Expressions.stringPath("dd");
    StringPath ss = Expressions.stringPath("ss");
 
    SimpleTemplate<String> crm_Province = Expressions.template(String.class, "dd.crm_Province");
 
    SimpleTemplate<String> sscrm_Province = Expressions.template(String.class, "ss.crm_Province");
    SimpleTemplate<String> province_Name = Expressions.template(String.class, "dd.province_Name");
    NumberTemplate<Long> anncount = Expressions.numberTemplate(Long.class, "nvl(dd.anncount, 0)");
    NumberTemplate<Long> yicansai = Expressions.numberTemplate(Long.class, "nvl(dd.yicansai, 0)");
    NumberTemplate<Long> weicansai = Expressions.numberTemplate(Long.class, "nvl(ss.weicansai, 0)");
    NumberTemplate<Integer> template = Expressions
        .numberTemplate(Integer.class, "rank() over(order by nvl(dd.anncount, 0) desc)");
 
    OrderSpecifier order = new OrderSpecifier(Order.DESC,
        Expressions.template(String.class, "dd.anncount"));
 
    SubQueryExpression query = SQLExpressions
        .select(user.crm_Province, user.province_Name,
            user.annuali_Count.sum().as("anncount"),
            user.staff_Id.countDistinct().as("yicansai"))
        .from(user)
        .where(user.is_CLOSE.eq(1), user.role_Id.eq("00"), user.is_Login.eq("1"))
        .groupBy(user.crm_Province, user.province_Name);
 
    SubQueryExpression query1 = SQLExpressions
        .select(user1.crm_Province, user1.staff_Id.countDistinct().as("weicansai"))
        .from(user1)
        .where(user1.is_CLOSE.eq(1), user1.role_Id.eq("00"), user1.is_Login.eq("0"))
        .groupBy(user1.crm_Province);
 
    return factory.select(
        Projections.bean(StaffRank.class,
            crm_Province.as("crm_Province"),
            province_Name.as("province_Name"), anncount.as("anncount"),
            yicansai.as("yicansai"), weicansai.as("weicansai"), template.as("rank")))
        .from(query, dd).leftJoin(query1, ss).on(crm_Province.eq(sscrm_Province)).orderBy(order)
        .fetch();
  }
QMatchReportUser user = new QMatchReportUser("tm_match_report_user");

这个应该不用解释了,QueryDsl会自动生成大写Q的实体类,tm_match_report_user是表名。

有需要的童鞋可以参考下,基本上大同小异。

需要注意的是

 NumberTemplate<Integer> template = Expressions
                   .numberTemplate(Integer.class,
                   "rank() over(order by nvl(dd.anncount, 0) desc)");

还可以通过占位符的样式来写

NumberTemplate<Integer> template = Expressions
                    .numberTemplate(Integer.class, 
                    "rank() over(order by nvl(sum({0}), 0) desc)",quser.opening_Count);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解读JVM的生命周期是怎么样的

    解读JVM的生命周期是怎么样的

    JVM的生命周期包括启动、运行和终止三个阶段,启动阶段包括创建JVM实例、加载和初始化核心类库、加载main方法所在的类和初始化类,运行阶段包括执行main方法、类加载、字节码执行、内存管理、线程管理和异常处理,终止阶段包括正常终止、异常终止和外部终止
    2025-03-03
  • Java平闰年判断的方法总结

    Java平闰年判断的方法总结

    本篇文章给大家整理了Java平闰年判断的两种方法,大家在写程序的时候如果用的到参考下吧。
    2018-02-02
  • java int转byte和long转byte的方法

    java int转byte和long转byte的方法

    下面小编就为大家带来一篇java int转byte和long转byte的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • springboot2.0 配置时间格式化不生效问题的解决

    springboot2.0 配置时间格式化不生效问题的解决

    这篇文章主要介绍了springboot2.0 配置时间格式化不生效问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java实现AOP功能的封装与配置的小框架实例代码

    Java实现AOP功能的封装与配置的小框架实例代码

    这篇文章主要介绍了Java实现AOP功能的封装与配置的小框架实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Idea配置Maven阿里云镜像加速的实现

    Idea配置Maven阿里云镜像加速的实现

    这篇文章主要介绍了Idea配置Maven阿里云镜像加速的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Minio 上传文件请求负载原理解析

    Minio 上传文件请求负载原理解析

    MinIO集群通过分布式存储和负载均衡机制实现文件上传请求的分发,核心原理包括数据分片和冗余、负载均衡、一致性哈希和并行处理,Java示例展示了如何实现文件上传分发逻辑,感兴趣的朋友一起看看吧
    2025-03-03
  • Java判断List中相同值元素的个数实例

    Java判断List中相同值元素的个数实例

    今天小编就为大家分享一篇Java判断List中相同值元素的个数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • springsecurity基于token的认证方式

    springsecurity基于token的认证方式

    本文主要介绍了springsecurity基于token的认证方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java之Springcloud Feign组件详解

    Java之Springcloud Feign组件详解

    这篇文章主要介绍了Java之Springcloud Feign组件详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论