SpringBoot之QueryDsl嵌套子查詢問題
QueryDsl嵌套子查詢
我項(xiàng)目中要求所有的SQL必須以JPA的QueryDsl格式進(jìn)行數(shù)據(jù)庫操作,其中有一個(gè)稍微復(fù)雜點(diǎn)的嵌套子查詢,網(wǎng)上資料比較少,而且子查詢也特別簡單。
費(fèi)了好大的勁才搞出來,現(xiàn)貼出來供大家參考。
這是MyBatis的查詢格式
select dd.crm_province as 省編碼,
dd.province_name as 省份,
nvl(dd.anncount, 0) as 年化收入,
nvl(dd.yicansai, 0) as 已參賽人數(shù),
nvl(ss.weicansai, 0) as 未參賽人數(shù),
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格式
/**
* 復(fù)雜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");這個(gè)應(yīng)該不用解釋了,QueryDsl會(huì)自動(dòng)生成大寫Q的實(shí)體類,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);總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法
下面小編就為大家?guī)硪黄猨ava int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10
springboot2.0 配置時(shí)間格式化不生效問題的解決
這篇文章主要介紹了springboot2.0 配置時(shí)間格式化不生效問題的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java實(shí)現(xiàn)AOP功能的封裝與配置的小框架實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)AOP功能的封裝與配置的小框架實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn)
這篇文章主要介紹了Idea配置Maven阿里云鏡像加速的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Java判斷List中相同值元素的個(gè)數(shù)實(shí)例
今天小編就為大家分享一篇Java判斷List中相同值元素的個(gè)數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
springsecurity基于token的認(rèn)證方式
本文主要介紹了springsecurity基于token的認(rèn)證方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

