如果是初次使用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();
創建對應對象和別名,這樣關聯查詢時纔會區分。
3. 格式化字段進行查詢
QHajOrder order = QHajOrder.hajOrder;
//格式化字段,按每日格式化
StringTemplate dateExpr = Expressions.stringTemplate("DATE_FORMAT({0},'%Y-%m-%d')", order.createTime);
return jpaQueryFactory.select(dateExpr,order.id.count())
.from(order)
.orderBy(order.id.desc())
.groupBy(dateExpr)
.limit(5)
.fetch();
獲取到每日訂單數量
資料:
https://github.com/querydsl/querydsl/