使用QueryDSL過程中你肯定遇到過的問題

  如果是初次使用QueryDSL的同學建議去這篇博客:SpringDataJPA+QueryDSL玩轉態動條件/投影查詢,本文針探討的是使用時遇到的一些問題:

  1. 如何使用Projections.bean投影屬性到查詢對象,簡化代碼?
  2. 如何使用級聯查詢,關聯同一張表兩次?

 

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/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章