使用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 ] }