动态SQL实现指定返回字段
iSetYu 人气:8动态SQL实现前端指定返回字段
问题描述
在使用ClickHouse时,遇到需要根据业务需求,动态返回指定字段,从而充分利用ClickHouse列式存储的优势。
解决方案
可用MyBatis的动态SQL进行数据返回;故可在业务层将指定返回的列传入数据层,利用foreach标签进行遍历返回数据。
代码实现
1.请求参数
@Data public class QueryDTO { /** * 返回值 */ private Set<String> targetFields; }
2.mapper接口
/** * 查询数据 * @param record * @return */ List<ResourceTotal> query(QueryDTO record);
3.mapper.xml实现
<sql id="Base_Result_Column"> resourceId, platformCount, createUserId </sql>
<select id="query" parameterType="cn.example.module.data.test.QueryDTO" resultMap="BaseResultMap"> select <foreach collection="targetFields" item="item" separator=","> ${item} </foreach> , <include refid="Base_Result_Column"/> from resource_total where 1 = 1 </select>
4.注意事项
a.使用动态返回字段时,不可使用预先编译,故foreach中使用‘$’符号,而不使用‘#’;
b.foreach标签后若还有其他固定字段返回,记得用逗号‘,’分隔。
MyBatis如何返回部分字段
mybatis 返回部分字段,这里介绍两种方式(主推第一种)
.xml文件中resultMap的type改为
java.util.HashMap 即可
其余代码都不用写, 亲测可用,xml文件中代码如下:
<!-- 返回类型 --> <resultMap id="testRestMap" type="java.util.HashMap"> <result column="province_name" jdbcType="VARCHAR" property="provinceName" /> <result column="area_name" jdbcType="VARCHAR" property="areaName" /> <result column="lane_num" jdbcType="VARCHAR" property="laneNum" /> <result column="road_name" jdbcType="VARCHAR" property="roadName" /> </resultMap> <!--sql查询 --> <select id="selTest" resultMap="testRestMap"> select province_name, area_name,lane_num, road_name from site_info where 1=1 and del_flag='0' </select>
第二种很笨的方法
重新新建一个对象实体,该实体文件的字段与要返回的 “部分字段” 一一对应即可,代码如下:
resultMap 的type=com.sinosoft.pojo.DeviceNumber 指向一个文件,该文件为新建实体类,里面是要返回的 “部分字段”
<!-- 全省设备数量统计 数据返回 --> <resultMap id="DeviceNumber" type="com.sinosoft.pojo.DeviceNumber"> <result column="distCode" jdbcType="VARCHAR" property="distCode" /> <result column="distName" jdbcType="VARCHAR" property="distName" /> <result column="number" jdbcType="VARCHAR" property="number" /> </resultMap> <!-- 全省设备数量统计 --> <select id="statisticsDevice" resultMap="DeviceNumber"> SELECT t1.distCode, t1.distName, t2.number FROM ( select fd_objectid distCode, area_name distName FROM t_sys_area WHERE LEVEL='2' ) t1 LEFT JOIN ( SELECT city_no, count(*) as number FROM site_info WHERE 1=1 and del_flag='0' and is_bridge!='1' GROUP BY city_no )t2 on t2.city_no=t1.distCode </select>
DeviceNumber 文件内容如下:
package com.sinosoft.pojo; /** * 数据返回 * @author zhangyajuan * */ public class DeviceNumber { private String distCode;//行政区划 private String distName;//行政区划名称 private String number;//设备数量 public String getDistCode() { return distCode; } public void setDistCode(String distCode) { this.distCode = distCode; } public String getDistName() { return distName; } public void setDistName(String distName) { this.distName = distName; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容