SpringBoot之QueryDsl嵌套子查询问题怎么解决

其他教程   发布日期:2023年08月29日   浏览次数:751

今天小编给大家分享一下SpringBoot之QueryDsl嵌套子查询问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    QueryDsl嵌套子查询

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

    这是MyBatis的查询格式

    1. select dd.crm_province as 省编码,
    2. dd.province_name as 省份,
    3. nvl(dd.anncount, 0) as 年化收入,
    4. nvl(dd.yicansai, 0) as 已参赛人数,
    5. nvl(ss.weicansai, 0) as 未参赛人数,
    6. rank() over(order by nvl(dd.anncount, 0) desc) as 排名
    7. from (select ll.crm_province,
    8. ll.province_name,
    9. nvl(sum(ll.annuali_count), 0) anncount,
    10. count(distinct ll.staff_id) yicansai
    11. from tm_match_report_user ll
    12. where ll.is_close = 1
    13. and ll.role_id = 00
    14. and ll.is_login = 1
    15. group by ll.crm_province, ll.province_name) dd
    16. left join (select ll.crm_province, count(distinct ll.staff_id) weicansai
    17. from tm_match_report_user ll
    18. where ll.is_close = 1
    19. and ll.role_id = 00
    20. and ll.is_login = 0
    21. group by ll.crm_province) ss
    22. on dd.crm_province = ss.crm_province
    23. order by dd.anncount desc

    这是JPA的QueryDsl格式

    1. /**
    2. * 复杂sql查询 -- 双子查询Join
    3. * @return
    4. */
    5. public List<StaffRank> topBind() {
    6. QMatchReportUser user = new QMatchReportUser("tm_match_report_user");
    7. QMatchReportUser user1 = new QMatchReportUser("tm_match_report_user");
    8. StringPath dd = Expressions.stringPath("dd");
    9. StringPath ss = Expressions.stringPath("ss");
    10. SimpleTemplate<String> crm_Province = Expressions.template(String.class, "dd.crm_Province");
    11. SimpleTemplate<String> sscrm_Province = Expressions.template(String.class, "ss.crm_Province");
    12. SimpleTemplate<String> province_Name = Expressions.template(String.class, "dd.province_Name");
    13. NumberTemplate<Long> anncount = Expressions.numberTemplate(Long.class, "nvl(dd.anncount, 0)");
    14. NumberTemplate<Long> yicansai = Expressions.numberTemplate(Long.class, "nvl(dd.yicansai, 0)");
    15. NumberTemplate<Long> weicansai = Expressions.numberTemplate(Long.class, "nvl(ss.weicansai, 0)");
    16. NumberTemplate<Integer> template = Expressions
    17. .numberTemplate(Integer.class, "rank() over(order by nvl(dd.anncount, 0) desc)");
    18. OrderSpecifier order = new OrderSpecifier(Order.DESC,
    19. Expressions.template(String.class, "dd.anncount"));
    20. SubQueryExpression query = SQLExpressions
    21. .select(user.crm_Province, user.province_Name,
    22. user.annuali_Count.sum().as("anncount"),
    23. user.staff_Id.countDistinct().as("yicansai"))
    24. .from(user)
    25. .where(user.is_CLOSE.eq(1), user.role_Id.eq("00"), user.is_Login.eq("1"))
    26. .groupBy(user.crm_Province, user.province_Name);
    27. SubQueryExpression query1 = SQLExpressions
    28. .select(user1.crm_Province, user1.staff_Id.countDistinct().as("weicansai"))
    29. .from(user1)
    30. .where(user1.is_CLOSE.eq(1), user1.role_Id.eq("00"), user1.is_Login.eq("0"))
    31. .groupBy(user1.crm_Province);
    32. return factory.select(
    33. Projections.bean(StaffRank.class,
    34. crm_Province.as("crm_Province"),
    35. province_Name.as("province_Name"), anncount.as("anncount"),
    36. yicansai.as("yicansai"), weicansai.as("weicansai"), template.as("rank")))
    37. .from(query, dd).leftJoin(query1, ss).on(crm_Province.eq(sscrm_Province)).orderBy(order)
    38. .fetch();
    39. }
    1. QMatchReportUser user = new QMatchReportUser("tm_match_report_user");

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

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

    需要注意的是

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

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

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

    以上就是SpringBoot之QueryDsl嵌套子查询问题怎么解决的详细内容,更多关于SpringBoot之QueryDsl嵌套子查询问题怎么解决的资料请关注九品源码其它相关文章!