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

免费教程   2024年05月10日 17:58  

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

QueryDsl嵌套子查询

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

这是MyBatis的查询格式selectdd.crm_provinceas省编码,dd.province_nameas省份,nvl(dd.anncount,0)as年化收入,nvl(dd.yicansai,0)as已参赛人数,nvl(ss.weicansai,0)as未参赛人数,rank()over(orderbynvl(dd.anncount,0)desc)as排名from(selectll.crm_province,ll.province_name,nvl(sum(ll.annuali_count),0)anncount,count(distinctll.staff_id)yicansaifromtm_match_report_userllwherell.is_close=1andll.role_id=00andll.is_login=1groupbyll.crm_province,ll.province_name)ddleftjoin(selectll.crm_province,count(distinctll.staff_id)weicansaifromtm_match_report_userllwherell.is_close=1andll.role_id=00andll.is_login=0groupbyll.crm_province)ssondd.crm_province=ss.crm_provinceorderbydd.anncountdesc这是JPA的QueryDsl格式/***复杂sql查询--双子查询Join*@return*/publicList<StaffRank>topBind(){QMatchReportUseruser=newQMatchReportUser("tm_match_report_user");QMatchReportUseruser1=newQMatchReportUser("tm_match_report_user");StringPathdd=Expressions.stringPath("dd");StringPathss=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(orderbynvl(dd.anncount,0)desc)");OrderSpecifierorder=newOrderSpecifier(Order.DESC,Expressions.template(String.class,"dd.anncount"));SubQueryExpressionquery=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);SubQueryExpressionquery1=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);returnfactory.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();}QMatchReportUseruser=newQMatchReportUser("tm_match_report_user");

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

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

需要注意的是NumberTemplate<Integer>template=Expressions.numberTemplate(Integer.class,"rank()over(orderbynvl(dd.anncount,0)desc)");还可以通过占位符的样式来写NumberTemplate<Integer>template=Expressions.numberTemplate(Integer.class,"rank()over(orderbynvl(sum({0}),0)desc)",quser.opening_Count);

以上就是“SpringBoot之QueryDsl嵌套子查询问题怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部