Java如何使用Query动态拼接SQL详解
前言
之前有做个一个自定义报表的查询,这里使用的是一个动态的sql拼接,是前端选择了什么指标就查询什么信息!(这里的指标是多个表的字段,前端随便选择了这些指标,然后后端根据这些指标拼接sql,返回这些指标的数据)。
参数接受DTO
publicclassDefinedReportFormDTO{ /** *指标id */ privateListids; /** *开始时间 */ @DateTimeFormat(pattern="yyyy-MM") privateDatestartTime; /** *结束时间 */ @DateTimeFormat(pattern="yyyy-MM") privateDateendTime; /** *频率 */ privateStringtimeStyle; privatebooleanavg=false; privateStringidsParam; privateStringcompanyIdsParam; publicvoidsetCompanyIdsParam(StringcompanyIdsParam){ this.companyIdsParam=companyIdsParam; } publicvoidsetIdsParam(StringidsParam){ this.idsParam=idsParam; } publicStringgetCompanyIdsParam(){ returncompanyIdsParam; } publicStringgetIdsParam(){ returnidsParam; } publicbooleanisAvg(){ returnavg; } publicvoidsetAvg(booleanavg){ this.avg=avg; } publicDategetStartTime(){ returnstartTime; } publicvoidsetStartTime(DatestartTime){ this.startTime=startTime; } publicDategetEndTime(){ returnendTime; } publicvoidsetEndTime(DateendTime){ this.endTime=endTime; } publicStringgetTimeStyle(){ returntimeStyle; } publicvoidsetTimeStyle(StringtimeStyle){ this.timeStyle=timeStyle; } publicListgetIds(){ returnids; } publicvoidsetIds(Listids){ this.ids=ids; } }
数据返回VO
publicclassDefinedReportFormVOimplementsSerializable{ privateStringtime; privateList
控制器Controller
@GetMapping("/report/defindReport") publicJsonResponseExtdefindReport(DefinedReportFormDTOdefinedReportFormDTO){ //测试数据 Listlist1=newArrayList<>(); list1.add("111"); definedReportFormDTO.setIds(list1); definedReportFormDTO.setTimeStyle("month"); definedReportFormDTO.setAvg(true); Calendarinstance=Calendar.getInstance(); instance.set(2018,1,11); definedReportFormDTO.setStartTime(instance.getTime()); instance.setTime(newDate()); definedReportFormDTO.setEndTime(instance.getTime()); returnJsonResponseExt.success(dataAcquisitionFileInfoService.defindQuery(definedReportFormDTO)); }
服务类Service
publicinterfaceDataAcquisitionFileInfoService{ ListdefindQuery(DefinedReportFormDTOparameter); }
实现类ServiceImpl
@SuppressWarnings("unchecked") @Override publicListdefindQuery(DefinedReportFormDTOparameter){ /** *定义五张表的查询字符串,年月,和机构id默认查询 */ StringBuilderorgInformationCbrc=newStringBuilder("selectreporting_yearasreportingYear,reporting_monthasreportingMonth,company_id,"); StringBuilderorgBasicInformation=newStringBuilder("selectreporting_yearasreportingYear,reporting_monthasreportingMonth,company_id,"); StringBuilderorgBusinessStructure=newStringBuilder("selectreporting_yearasreportingYear,reporting_monthasreportingMonth,company_id,"); StringBuilderorgProfit=newStringBuilder("selectreporting_yearasreportingYear,reporting_monthasreportingMonth,company_id,"); StringBuilderorgBalanceSheets=newStringBuilder("selectreporting_yearasreportingYear,reporting_monthasreportingMonth,company_id,"); //定义机构的字符串 StringBuildercompanyIds=newStringBuilder(""); //查询所有机构 List orgList=orgService.getOrgList(); //拼接所有机构的字符串(如果需要求平均数的话) for(Companycompany:orgList){ companyIds.append(company.getId()+","); } companyIds.deleteCharAt(companyIds.length()-1); //定义每个表的字符串判断 Map bool=newHashMap<>(); //指标名 List fieldNames=newArrayList(); //返回结果 List >result=newArrayList<>(); //指标名默认添加年月机构id fieldNames.add("reportingYear"); fieldNames.add("reportingMonth"); fieldNames.add("companyId"); //定义指标id集合 Listids=parameter.getIds(); //循环所有的指标 for(Objectid:ids){ //如果指标为空 if(!"".equals(id)&&id!=null){ //根据指标id查询指标 OrgStatisticalIndicatorsorgStatisticalIndicators=orgStatisticalIndicatorsRespository.findByIdAndAndDelFlag(Long.parseLong(id.toString())); if(("year".equals(parameter.getTimeStyle())&&"0".equals(orgStatisticalIndicators.getYearQuery()))||("month".equals(parameter.getTimeStyle())&&"0".equals(orgStatisticalIndicators.getMonthQuery()))){ /** *判断指标所在的表,然后为各自的表拼接上表的字段 */ if("org_information_cbrc".equals(orgStatisticalIndicators.getTableName())){ orgInformationCbrc.append("ifnull("+orgStatisticalIndicators.getTableField()+",0)AS"+orgStatisticalIndicators.getField()+","); // if(bool.get("org_information_cbrc")==null){ bool.put("org_information_cbrc",orgStatisticalIndicators.getTableField()); } //如果其他表不存在这个属性则为其他表拼接null orgBasicInformation.append("nullas"+orgStatisticalIndicators.getField()+","); orgBalanceSheets.append("nullas"+orgStatisticalIndicators.getField()+","); orgBusinessStructure.append("nullas"+orgStatisticalIndicators.getField()+","); orgProfit.append("nullas"+orgStatisticalIndicators.getField()+","); //行业平均 if(parameter.isAvg()){ if("year".equals(parameter.getTimeStyle())){ orgInformationCbrc.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearANDreporting_month='12')AS"+orgStatisticalIndicators.getField()+"Avg,"); }else{ orgInformationCbrc.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } orgBalanceSheets.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBasicInformation.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBusinessStructure.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgProfit.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } }elseif("org_basic_information".equals(orgStatisticalIndicators.getTableName())){ if(bool.get("org_basic_information")==null){ bool.put("org_basic_information",orgStatisticalIndicators.getTableField()); } orgBasicInformation.append("ifnull("+orgStatisticalIndicators.getTableField()+",0)AS"+orgStatisticalIndicators.getField()+","); orgInformationCbrc.append("nullas"+orgStatisticalIndicators.getField()+","); orgBalanceSheets.append("nullas"+orgStatisticalIndicators.getField()+","); orgBusinessStructure.append("nullas"+orgStatisticalIndicators.getField()+","); orgProfit.append("nullas"+orgStatisticalIndicators.getField()+","); //行业平均 if(parameter.isAvg()){ if("year".equals(parameter.getTimeStyle())){ orgBasicInformation.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearANDreporting_month='12')AS"+orgStatisticalIndicators.getField()+"Avg,"); }else{ orgBasicInformation.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } orgProfit.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgInformationCbrc.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBalanceSheets.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBusinessStructure.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } }elseif("org_business_structure".equals(orgStatisticalIndicators.getTableName())){ orgBusinessStructure.append("ifnull("+orgStatisticalIndicators.getTableField()+",0)AS"+orgStatisticalIndicators.getField()+","); if(bool.get("org_business_structure")==null){ bool.put("org_business_structure",orgStatisticalIndicators.getTableField()); } orgBasicInformation.append("nullas"+orgStatisticalIndicators.getField()+","); orgInformationCbrc.append("nullas"+orgStatisticalIndicators.getField()+","); orgBalanceSheets.append("nullas"+orgStatisticalIndicators.getField()+","); orgProfit.append("nullas"+orgStatisticalIndicators.getField()+","); //行业平均 if(parameter.isAvg()){ if("year".equals(parameter.getTimeStyle())){ orgBusinessStructure.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearANDreporting_month='12')AS"+orgStatisticalIndicators.getField()+"Avg,"); }else{ orgBusinessStructure.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } orgProfit.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgInformationCbrc.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBalanceSheets.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBasicInformation.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } }elseif("org_profit".equals(orgStatisticalIndicators.getTableName())){ orgProfit.append("ifnull("+orgStatisticalIndicators.getTableField()+",0)AS"+orgStatisticalIndicators.getField()+","); if(bool.get("org_profit")==null){ bool.put("org_profit",orgStatisticalIndicators.getTableField()); } orgBasicInformation.append("nullas"+orgStatisticalIndicators.getField()+","); orgInformationCbrc.append("nullas"+orgStatisticalIndicators.getField()+","); orgBalanceSheets.append("nullas"+orgStatisticalIndicators.getField()+","); orgBusinessStructure.append("nullas"+orgStatisticalIndicators.getField()+","); //行业平均 if(parameter.isAvg()){ if("year".equals(parameter.getTimeStyle())){ orgProfit.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearANDreporting_month='12')AS"+orgStatisticalIndicators.getField()+"Avg,"); }else{ orgProfit.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } orgBasicInformation.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgInformationCbrc.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBalanceSheets.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBusinessStructure.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } }elseif("org_balance_sheets".equals(orgStatisticalIndicators.getTableName())){ orgBalanceSheets.append("ifnull("+orgStatisticalIndicators.getTableField()+",0)AS"+orgStatisticalIndicators.getField()+","); if(bool.get("org_balance_sheets")==null){ bool.put("org_balance_sheets",orgStatisticalIndicators.getTableField()); } orgBasicInformation.append("nullas"+orgStatisticalIndicators.getField()+","); orgInformationCbrc.append("nullas"+orgStatisticalIndicators.getField()+","); orgBusinessStructure.append("nullas"+orgStatisticalIndicators.getField()+","); orgProfit.append("nullas"+orgStatisticalIndicators.getField()+","); //行业平均 if(parameter.isAvg()){ if("year".equals(parameter.getTimeStyle())){ orgBalanceSheets.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearANDreporting_month='12')AS"+orgStatisticalIndicators.getField()+"Avg,"); }else{ orgBalanceSheets.append("(SELECTavg("+orgStatisticalIndicators.getTableField()+")FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } orgProfit.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgInformationCbrc.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBalanceSheets.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); orgBusinessStructure.append("(SELECTavg(null)FROM"+orgStatisticalIndicators.getTableName()+"wherereporting_year=reportingYearandreporting_month=reportingMonth)AS"+orgStatisticalIndicators.getField()+"Avg,"); } } if(parameter.isAvg()==true){ fieldNames.add(orgStatisticalIndicators.getField()); fieldNames.add(orgStatisticalIndicators.getField()+"Avg"); }else{ fieldNames.add(orgStatisticalIndicators.getField()); } } } } //拼接where条件 StringBuilderwhereSql=newStringBuilder("WHERE1=1"); if("year".equals(parameter.getTimeStyle())){ whereSql.append("ANDreporting_year>=:startYearandreporting_year<=:endYearANDreporting_month='12'"); }else{ whereSql.append("andCONCAT(reporting_year,'-',Right(100+CAST(reporting_monthasSIGNED),2))>=:startYearandCONCAT(reporting_year,'-',Right(100+CAST(reporting_monthasSIGNED),2))<=:endYear"); } //获取所有机构id ListparameterCompanyIds=parameter.getCompanyIds(); //如果机构id不为空 if(parameterCompanyIds.size()>0){ whereSql.append("ANDcompany_idin("); for(inti=0;i >"+orgBalanceSheets.toString()); //创建本地sql查询实例 orgBalanceSheetsQuery=entityManager.createNativeQuery(orgBalanceSheets.toString()); //如果时间为空那就获取现在的时间 if(parameter.getEndTime()==null){ parameter.setEndTime(newDate()); } if(parameter.getStartTime()==null){ parameter.setStartTime(newDate()); } if("year".equals(parameter.getTimeStyle())){ orgBalanceSheetsQuery.setParameter("startYear",com.honebay.spv.core.utils.DateUtil.formatDate(parameter.getStartTime(),"yyyy")); orgBalanceSheetsQuery.setParameter("endYear",com.honebay.spv.core.utils.DateUtil.formatDate(parameter.getEndTime(),"yyyy")); }elseif("month".equals(parameter.getTimeStyle())){ orgBalanceSheetsQuery.setParameter("startYear",com.honebay.spv.core.utils.DateUtil.formatDate(parameter.getStartTime(),"yyyy-MM")); orgBalanceSheetsQuery.setParameter("endYear",com.honebay.spv.core.utils.DateUtil.formatDate(parameter.getEndTime(),"yyyy-MM")); } if(parameterCompanyIds.size()>0){ for(inti=0;i map=newHashMap<>(); if(cells.length==3){ continue; } for(intj=0;j definedReportFormVOList=newArrayList<>(); Map stringListMap=newHashMap<>(); //定义返回的格式 for(Map map:result){ StringreportingYear=(String)map.get("reportingYear"); StringreportingMonth=(String)map.get("reportingMonth"); StringreportingDate=reportingYear+"-"+reportingMonth; //如果时间类型是年 if("year".equals(parameter.getTimeStyle())){ Listlist=stringListMap.get(reportingYear); if(list!=null){ list.add(map); stringListMap.put(reportingYear,list); }else{ Listinner=newArrayList(); inner.add(map); stringListMap.put(reportingYear,inner); } }else{//如果为月 Listlist=stringListMap.get(reportingDate); if(list!=null){ list.add(map); stringListMap.put(reportingDate,list); }else{ Listinner=newArrayList(); inner.add(map); stringListMap.put(reportingDate,inner); } } } System.out.println("stringListMap=="+stringListMap); for(Map.Entry entry:stringListMap.entrySet()){ DefinedReportFormVOformVO=newDefinedReportFormVO(); formVO.setTime(entry.getKey()); if(parameter.isAvg()==true){ formVO.setArr(setAvg(entry.getValue(),fieldNames)); }else{ formVO.setArr(entry.getValue()); } definedReportFormVOList.add(formVO); } returndefinedReportFormVOList; }
指标实体
/** *统计指标 */ @Entity @Table(name="org_statistical_indicators",catalog="zhsupervision") publicclassOrgStatisticalIndicators{ @Id @GeneratedValue privateLongid; /** *前端显示名 */ privateStringname; /** *表属性 */ privateStringtableField; /** *表名称 */ privateStringtableName; /** *创建时间 */ privateDatecreateTime; /** *更新时间 */ privateDateupdateTime; /** *删除标识 */ privateStringdelFlag; //父节点 privateLongpId; //属性 privateStringfield; //该指标查询月的时候是否查询 privateStringmonthQuery; //该指标查询年的时候是否查询 privateStringyearQuery; publicStringgetMonthQuery(){ returnmonthQuery; } publicvoidsetMonthQuery(StringmonthQuery){ this.monthQuery=monthQuery; } publicStringgetYearQuery(){ returnyearQuery; } publicvoidsetYearQuery(StringyearQuery){ this.yearQuery=yearQuery; } publicStringgetField(){ returnfield; } publicvoidsetField(Stringfield){ this.field=field; } publicLonggetId(){ returnid; } publicvoidsetId(Longid){ this.id=id; } publicLonggetpId(){ returnpId; } publicvoidsetpId(LongpId){ this.pId=pId; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetTableField(){ returntableField; } publicvoidsetTableField(StringtableField){ this.tableField=tableField; } publicStringgetTableName(){ returntableName; } publicvoidsetTableName(StringtableName){ this.tableName=tableName; } publicDategetCreateTime(){ returncreateTime; } publicvoidsetCreateTime(DatecreateTime){ this.createTime=createTime; } publicDategetUpdateTime(){ returnupdateTime; } publicvoidsetUpdateTime(DateupdateTime){ this.updateTime=updateTime; } publicStringgetDelFlag(){ returndelFlag; } publicvoidsetDelFlag(StringdelFlag){ this.delFlag=delFlag; } }
指标Service
/** *统计指标服务类 */ publicinterfaceOrgStatisticalIndicatorsService{ /** *根据id获取 *@paramid *@return */ OrgStatisticalIndicatorsfindOrgStatisticalIndicatorsById(Longid); /** *根据表名查询 */ ListfindOrgStatisticalIndicatorsByTableName(Stringname); }
指标serviceImpl
@Service publicclassOrgStatisticalIndicatorsServiceImplextendsBaseServiceImplimplementsOrgStatisticalIndicatorsService{ @Autowired privateOrgStatisticalIndicatorsRespositoryrespository; @Override publicOrgStatisticalIndicatorsfindOrgStatisticalIndicatorsById(Longid){ returnrespository.findByIdAndAndDelFlag(id); } @Override publicList findOrgStatisticalIndicatorsByTableName(Stringname){ returnrespository.findOrgStatisticalIndicatorsByTableName(name); } }
指标repository
publicinterfaceOrgStatisticalIndicatorsRespositoryextendsJpaSpecificationExecutor{ @Query(value="select*fromorg_statistical_indicatorsWHEREID=?1anddel_flag='0'",nativeQuery=true) OrgStatisticalIndicatorsfindByIdAndAndDelFlag(Longid); @Query(value="select*fromorg_statistical_indicatorsWHEREdel_flag='0'andNAME=?1",nativeQuery=true) OrgStatisticalIndicatorsfindOrgStatisticalIndicatorsByName(Stringname); }
这个repository要继承extendsJpaRepository
上面使用了union进行表之间的关联查询,关联的表有点多,所以代码有些长,同时因为表多,指标(表的属性)有500多个,无法确定查询的返回实体,所以只能自己根据数据的返回给数据绑定属性。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。