问题描述
在使用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标签后若还有其他固定字段返回,记得用逗号‘,’分隔。