如果是初次使用QueryDSL的同學建議去這篇博客:SpringDataJPA+QueryDSL玩轉態動條件/投影查詢,本文針探討的是使用時遇到的一些問題:
- 如何使用Projections.bean投影屬性到查詢對象,簡化代碼?
- 如何使用級聯查詢,關聯同一張表兩次?
1. Projections簡化代碼,使代碼更優雅
使用Projections方法可以更簡單更方便的返回自定義的參數屬性
QHajOrderDetails orderDetails = QHajOrderDetails.hajOrderDetails;
return jpaQueryFactory.select(
Projections.bean(
CommoditySalesDto.class,
orderDetails.number.sum().as("sales"),
orderDetails.commodityNo
)
).from(orderDetails)
.where(orderDetails.commodityNo.in(commodityNos))
.groupBy(orderDetails.commodityNo)
.fetch();
Projections的bean方法第一個屬性是要查詢對象的泛型類,對象中orderDetails.“commodityNo”屬性就是CommoditySalesDto對應屬性,大小寫相同。如屬性不同時可以使用as來爲指定結果集添加別名對應dto內屬性。
2. 關聯同一張表兩次進行查詢
有時遇到一些查詢需要在同一張表關聯查詢兩次或多次,知道在sql中怎麼寫,但是在querydsl中就不知道怎麼下手了,方法其實很簡單
QHajCommodityType type1 = new QHajCommodityType("type1");
QHajCommodityType type2 = new QHajCommodityType("type2");
return jPAQueryFactory.select(type2.id)
.from(type1)
.join(type2).on(type1.id.eq(type2.parentId))
.fetch();
創建對應對象和別名,這樣關聯查詢時纔會區分。
資料:
https://github.com/querydsl/querydsl/