今天小编给大家分享一下SpringBoot之QueryDsl嵌套子查询问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
我项目中要求所有的SQL必须以JPA的QueryDsl格式进行数据库操作,其中有一个稍微复杂点的嵌套子查询,网上资料比较少,而且子查询也特别简单。
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
/**
* 复杂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);
以上就是“SpringBoot之QueryDsl嵌套子查询问题怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://blog.csdn.net/zezezuiaiya/article/details/86351034