使用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/

 

 

你可能感兴趣的:(Java项目)