使用jpa利用queryDSL实现无sql聚合查询

1、直接上代码

public Result selectDate(QuestionnaireDataSearchDto searchDto){
          
   
        QWsHighTemperature qentity = QWsHighTemperature.wsHighTemperature;
        BlazeJPAQuery<Tuple> blazeJPAQuery = new BlazeJPAQuery<>(entityManager, createCriteriaBuilderFactory);
        blazeJPAQuery.from(qentity);
        //查询聚合结果
        blazeJPAQuery.select(qentity.dataTime.year(), qentity.dailyMaxTemperature.count());

        //拼接where条件
        blazeJPAQuery.where(qentity.stationCode.eq(searchDto.getStationCode()));
        blazeJPAQuery.where(qentity.dailyMaxTemperature.goe(35F));

        //按年进行聚合
        blazeJPAQuery.groupBy(qentity.dataTime.year());

        List<Tuple> fetch = blazeJPAQuery.fetch();
        Map<String, List<Object>> resultMap = new HashMap<>();
        resultMap.put("date", new ArrayList<>());
        resultMap.put("data", new ArrayList<>());
        // 对返回的数据进行封装,返回适合前端解析的格式。
        for (Tuple tuple : fetch) {
          
   
            resultMap.get("date").add(tuple.get(qentity.dataTime.year()));
            resultMap.get("data").add(tuple.get(qentity.dailyMaxTemperature.count()));
        }
        return Result.success(resultMap);
    }

返回结果,按照历年进行统计查询

{
          
   
		"date": [
			2005,
			2010,
			2017
		],
		"data": [
			3,
			2,
			2
		]
	}

2、补充一个自定义时间格式化的

public Result selectDate(QuestionnaireDataSearchDto searchDto){
          
   
        QWsHighTemperature qentity = QWsHighTemperature.wsHighTemperature;
        StringTemplate stringTemplate = Expressions.stringTemplate("TO_CHAR({0}, MM)", qentity.dataTime);
        BlazeJPAQuery<Tuple> blazeJPAQuery = new BlazeJPAQuery<>(entityManager, createCriteriaBuilderFactory);
        blazeJPAQuery.from(qentity);
        //查询聚合结果
        blazeJPAQuery.select(stringTemplate, qentity.dailyMaxTemperature.count());

        //拼接where条件
        blazeJPAQuery.where(qentity.stationCode.eq(searchDto.getStationCode()));
        blazeJPAQuery.where(qentity.dailyMaxTemperature.goe(35F));

        //按月进行聚合
        blazeJPAQuery.groupBy(stringTemplate);

        List<Tuple> fetch = blazeJPAQuery.fetch();
        Map<String, List<Object>> resultMap = new HashMap<>();
        resultMap.put("date", new ArrayList<>());
        resultMap.put("data", new ArrayList<>());
        // 对返回的数据进行封装,返回适合前端解析的格式。
        for (Tuple tuple : fetch) {
          
   
            resultMap.get("date").add(tuple.get(stringTemplate));
            resultMap.get("data").add(tuple.get(qentity.dailyMaxTemperature.count()));
        }
        return Result.success(resultMap);
    }

返回结果,按照累年每月进行聚合统计,不管有多少年返回的都是12个月

{
          
   
		"date": [
			"06",
			"07"
		],
		"data": [
			2,
			5
		]
	}
经验分享 程序员 微信小程序 职场和发展