ycl-common/src/main/java/constant/RecordingAvailability.java
New file @@ -0,0 +1,22 @@ package constant; public class RecordingAvailability { public final static String arealayername = "行政区域"; public final static String arealayerno = "行政区域ID"; public final static String createTime = "创建时间"; public final static String deviceId = "摄像机ID"; public final static String missDuration = "缺失时长"; public final static String platId = "国标平台ID"; public final static String recordDuration = "录像时长"; public final static String recordStatusText = "录像完整状态"; public final static String statTime = "统计时间"; } ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DynamicColumnValue.java
@@ -35,7 +35,8 @@ /** 关联的数据id */ private Integer refId; @TableField("ref_String_id") private String refStringId; } ycl-pojo/src/main/java/com/ycl/platform/domain/excel/RecordingAvailabilityExport.java
New file @@ -0,0 +1,54 @@ package com.ycl.platform.domain.excel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.DateTimeFormat; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.platform.domain.vo.DynamicColumnVO; import lombok.Data; import java.util.Date; import java.util.List; @Data public class RecordingAvailabilityExport { /** 行政区域*/ @ColumnWidth(100) @ExcelProperty("行政区域") private String arealayername; /** 行政区域id*/ @ColumnWidth(100) @ExcelProperty("行政区域ID") private String arealayerno; @ColumnWidth(100) @DateTimeFormat("yyyy-MM-dd") @ExcelProperty("创建时间") private Date createTime; @ColumnWidth(100) @ExcelProperty("摄像机ID") private String deviceId; @ColumnWidth(100) @ExcelProperty("缺失时长") private Double missDuration; @ColumnWidth(100) @ExcelProperty("国标平台ID") private String platId; @ColumnWidth(100) @ExcelProperty("录像时长") private Double recordDuration; @ColumnWidth(100) @ExcelProperty("录像完整状态") private String recordStatusText; @ColumnWidth(100) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ExcelProperty("统计时间") private Date statTime; } ycl-pojo/src/main/java/com/ycl/platform/domain/form/UpdateDynamicValueForm.java
New file @@ -0,0 +1,15 @@ package com.ycl.platform.domain.form; import com.ycl.platform.domain.vo.DynamicColumnVO; import jakarta.validation.constraints.NotBlank; import lombok.Data; import java.util.List; @Data public class UpdateDynamicValueForm { @NotBlank(message = "id不能为空") private String id; List<DynamicColumnVO> dynamicColumnVOList; } ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/RecordMetaDSumResult.java
@@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.platform.domain.result.BaseResult; import com.ycl.platform.domain.vo.DynamicColumnVO; import lombok.Data; import org.springframework.data.mongodb.core.index.CompoundIndex; import org.springframework.data.mongodb.core.index.CompoundIndexes; @@ -10,6 +11,7 @@ import org.springframework.data.mongodb.core.mapping.Document; import java.util.Date; import java.util.List; import java.util.Objects; /** @@ -81,7 +83,6 @@ * 录像完整状态,1:完整,0:间歇,-1:异常 */ private String recordStatusText; /** * 统计时间,格式为日期字符串 */ @@ -90,6 +91,11 @@ private Date statTime; /** * 动态列 */ private List<DynamicColumnVO> dynamicColumnList; /** * 租户ID */ private String tenantId; ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DynamicColumnVO.java
@@ -27,6 +27,10 @@ private String columnValue; /** 关联数据的id */ private Integer refId; /** 关联数据的id String类型*/ private String refStringId; /** value表的id */ private Integer valueId; public static DynamicColumnVO getVoByEntity(@NonNull DynamicColumn entity, DynamicColumnVO vo) { ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java
@@ -1,6 +1,7 @@ package com.ycl.platform.controller; import annotation.Log; import com.ycl.platform.domain.form.UpdateDynamicValueForm; import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.service.DataCenterService; import com.ycl.platform.service.ITMonitorService; @@ -12,6 +13,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.io.IOException; /** * 数据中心接口 @@ -147,6 +150,12 @@ return dataCenterService.deptVideoAvailabilityRate(query); } @PutMapping("/videoMinistryVideoAvailable/updateDynamicValue") public Result updateDynamicValue(@RequestBody UpdateDynamicValueForm form){ return dataCenterService.updateDynamicValue(form); } /** * 视频:录像可用率 * @@ -182,6 +191,21 @@ query.setTime(); return dataCenterService.videoImportantPointLabelingAccuracy(query); } @PostMapping("/recordingAvailability/export") public void recordingAvailabilityExport(HttpServletResponse response,DataCenterQuery query) throws IOException { query.setTime(); dataCenterService.recordingAvailabilityExport(response, query); } @PostMapping("/pointOnline/export") public void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException { query.setTime(); dataCenterService.pointOnlineExport(response,query); } /** * 视频:导出重点点位标注正确率 * ycl-server/src/main/java/com/ycl/platform/controller/DynamicColumnController.java
@@ -2,8 +2,8 @@ import com.ycl.system.Result; import com.ycl.system.domain.group.Add; import com.ycl.system.domain.group.Update; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; import lombok.RequiredArgsConstructor; @@ -12,7 +12,6 @@ import io.swagger.annotations.ApiOperation; import com.ycl.platform.service.DynamicColumnService; import com.ycl.platform.domain.form.DynamicColumnForm; import com.ycl.platform.domain.query.DynamicColumnQuery; import org.springframework.web.bind.annotation.*; /** @@ -54,4 +53,39 @@ public Result list() { return dynamicColumnService.all(); } @GetMapping("/listByTableName") @ApiOperation(value = "列表", notes = "列表") public Result listByTableName(@RequestParam @NotNull(message = "路径名不能为空")String pathName) { String tableName = getTableNameByPathNane(pathName); return dynamicColumnService.allByTableName(tableName); } @PostMapping("/addByTableName") @ApiOperation(value = "添加", notes = "添加") @PreAuthorize("@ss.hasPermi('dynamicColumn:add')") public Result addByTableName(@RequestParam @NotNull(message = "路径名不能为空")String pathName,@RequestBody @Validated(Add.class) DynamicColumnForm form){ String tableName = getTableNameByPathNane(pathName); return dynamicColumnService.addByTableName(tableName,form); } private final static String COLUMN_NAME_VIDEO = "uy_record_meta_d_sum"; private final static String COLUMN_NAME_POINT = ""; @PutMapping("/updateByTableName") @ApiOperation(value = "修改", notes = "修改") public Result updateByTableName(@RequestParam @NotNull(message = "路径名不能为空")String pathName, @RequestBody @NotEmpty(message = "数据为空,无法保存") List<DynamicColumnForm> columnList){ String tableName = getTableNameByPathNane(pathName); return dynamicColumnService.updateByTableName(tableName,columnList); } private String getTableNameByPathNane(String pathName) { String tableName = ""; if ("录像可用率".equals(pathName)){ tableName = COLUMN_NAME_VIDEO; }else if("点位在线率".equals(pathName)){ tableName = COLUMN_NAME_POINT; } return tableName; } } ycl-server/src/main/java/com/ycl/platform/mapper/DynamicColumnMapper.java
@@ -47,5 +47,7 @@ void deleteBatch(@Param("deleteList") List<Integer> deleteList); List<DynamicColumnVO> getDynamicColumnByTable(@Param("tableName")String tableName,@Param("id")String id); List<DynamicColumnVO> getDynamicColumnByTableName(@Param("tableName")String tableName); } ycl-server/src/main/java/com/ycl/platform/service/DataCenterService.java
@@ -1,13 +1,17 @@ package com.ycl.platform.service; import com.ycl.platform.domain.entity.DynamicColumn; import com.ycl.platform.domain.form.UpdateDynamicValueForm; import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.result.HK.*; import com.ycl.platform.domain.result.UY.MonitorQualifyResult; import com.ycl.platform.domain.result.UY.OneMachineFileResult; import com.ycl.platform.domain.result.UY.RecordMetaDSumResult; import com.ycl.platform.domain.vo.DynamicColumnVO; import com.ycl.system.Result; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; /** @@ -18,6 +22,12 @@ */ public interface DataCenterService { void recordingAvailabilityExport(HttpServletResponse response,DataCenterQuery query) throws IOException; void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException ; Result updateDynamicValue(UpdateDynamicValueForm form); /** * 视频:点位在线率 * ycl-server/src/main/java/com/ycl/platform/service/DynamicColumnService.java
@@ -23,11 +23,25 @@ Result add(DynamicColumnForm form); /** * 添加 * @param form * @return */ Result addByTableName(String table,DynamicColumnForm form); /** * 修改 * * @param columnList */ Result update(List<DynamicColumnForm> columnList); /** * 修改 * * @param columnList */ Result updateByTableName(String tableName,List<DynamicColumnForm> columnList); /** * id删除 @@ -41,4 +55,6 @@ * @return */ Result all(); Result allByTableName(String tableName); } ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -1,5 +1,7 @@ package com.ycl.platform.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; @@ -9,7 +11,9 @@ import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.ycl.platform.domain.entity.*; import com.ycl.platform.domain.excel.RecordingAvailabilityExport; import com.ycl.platform.domain.excel.TMonitorExp; import com.ycl.platform.domain.form.UpdateDynamicValueForm; import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.result.HK.*; import com.ycl.platform.domain.result.SYS.TMonitorResult; @@ -17,8 +21,10 @@ import com.ycl.platform.domain.vo.DataCenter.BigPicUsefulVO; import com.ycl.platform.domain.vo.DataCenter.MonitorQualifyResultVO; import com.ycl.platform.domain.vo.DataCenter.SnapClockVO; import com.ycl.platform.domain.vo.DynamicColumnVO; import com.ycl.platform.domain.vo.PointDetailVO; import com.ycl.platform.domain.vo.home.HomeFaceVO; import com.ycl.platform.mapper.DynamicColumnMapper; import com.ycl.platform.mapper.ImageResourceSecurityDetailMapper; import com.ycl.platform.mapper.YwPointMapper; import com.ycl.platform.service.*; @@ -31,9 +37,11 @@ import com.ycl.utils.poi.ExcelUtil; import constant.ApiConstants; import constant.CheckConstants; import constant.RecordingAvailability; import enumeration.general.AreaDeptEnum; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.bson.Document; import org.springframework.data.domain.Sort; @@ -44,6 +52,7 @@ import org.springframework.data.mongodb.core.query.TextCriteria; import org.springframework.stereotype.Service; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; @@ -60,6 +69,7 @@ */ @Service @RequiredArgsConstructor @Slf4j public class DataCenterServiceImpl implements DataCenterService { private final MongoTemplate mongoTemplate; @@ -68,11 +78,139 @@ private final ICheckIndexVideoService checkIndexVideoService; private final ICheckIndexCarService checkIndexCarService; private final ICheckIndexFaceService checkIndexFaceService; private final DynamicColumnMapper dynamicColumnMapper; private final static String TIME_FIELD = "mongoCreateTime"; private static DecimalFormat DF = new DecimalFormat("#.####"); @Override public void recordingAvailabilityExport(HttpServletResponse response,DataCenterQuery params) throws IOException { List<String> likeFileds = Arrays.asList("deviceId", "deviceName"); Query query = MongoUtil.getQuery(params, "createTime", likeFileds, null); //下拉框录像情况查询条件 if (params.getOption() != null) { query.addCriteria(Criteria.where("recordStatus").is(params.getOption())); } List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class); List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName("uy_record_meta_d_sum"); //翻译行政区域 resultList.forEach(item -> { String areaCode = item.getArealayername().substring(0, 6); AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode); if (areaDeptEnum != null) item.setArealayername(areaDeptEnum.getName()); }); Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId)); //提那家固定表头 LinkedHashSet<String> headers = new LinkedHashSet<>(); headers.add(RecordingAvailability.arealayername); headers.add(RecordingAvailability.arealayerno); headers.add(RecordingAvailability.createTime); headers.add(RecordingAvailability.deviceId); headers.add(RecordingAvailability.missDuration); headers.add(RecordingAvailability.platId); headers.add(RecordingAvailability.recordDuration); headers.add(RecordingAvailability.recordStatusText); headers.add(RecordingAvailability.statTime); List<String> headersList = new LinkedList<>(); List<String> dynamicsHeaders = dynamicColumnMapper.getHeader("uy_record_meta_d_sum"); //添加动态表头 if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) { //使用链表保证后续补充数据时获取数据顺序一致 headersList.addAll(dynamicsHeaders); headers.addAll(headersList); } SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List<List<Object>> data = new ArrayList<>(); for (RecordMetaDSumResult result : resultList){ List<Object> row = new ArrayList<>(); row.add(result.getArealayername()); row.add(result.getArealayerno()); row.add(dateFormat2.format(result.getCreateTime())); row.add(result.getDeviceId()); row.add(result.getMissDuration()); row.add(result.getPlatId()); row.add(result.getRecordDuration()); row.add(result.getRecordStatusText()); row.add(dateFormat2.format(result.getCreateTime())); //添加动态列数据 for (String header : headersList){ boolean flag = false; List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getId()); if (!CollectionUtils.isEmpty(columnVOS)) { for (DynamicColumnVO columnVO : columnVOS) { if (header.equals(columnVO.getLabelValue())) { row.add(columnVO.getColumnValue()); flag = true; } } } //没找到用空串占位 if (!flag) row.add(""); } data.add(row); } List<List<String>> headList = new ArrayList<>(); for (String header : headers) { headList.add(Collections.singletonList(header)); } EasyExcel.write(response.getOutputStream()) .head(headList) // 设置表头 .sheet("录像可用率") // 设置sheet名称 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .doWrite(data); // 写入数据 } @Override public void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException { } @Override public Result updateDynamicValue(UpdateDynamicValueForm form) { List<DynamicColumnVO> list = form.getDynamicColumnVOList(); if (CollectionUtils.isEmpty(list) || StringUtils.isEmpty(form.getId())) { throw new RuntimeException("修改自定义列的传入值为null或传入id为null"); } List<DynamicColumnValue> updateList = new ArrayList<>(); List<DynamicColumnValue> addList = new ArrayList<>(); for (DynamicColumnVO dynamicColumnVO : list){ if(dynamicColumnVO.getColumnValue() == null){ continue; } DynamicColumnValue dynamicColumnValue = new DynamicColumnValue(); dynamicColumnValue.setColumnValue(dynamicColumnVO.getColumnValue()); dynamicColumnValue.setDynamicColumnId(dynamicColumnVO.getId()); dynamicColumnValue.setRefStringId(form.getId()); dynamicColumnValue.setRefId(0); if(dynamicColumnVO.getValueId() == null){ addList.add(dynamicColumnValue); }else { dynamicColumnValue.setId(dynamicColumnVO.getValueId()); updateList.add(dynamicColumnValue); } } log.error("addList:{}",addList); log.error("updateList:{}",updateList); if (CollectionUtils.isNotEmpty(addList)){ dynamicColumnMapper.saveBatch(addList); } if (CollectionUtils.isNotEmpty(updateList)) { dynamicColumnMapper.updateBatch(updateList); } return Result.ok("修改成功"); } /** * 视频:点位在线率 @@ -798,6 +936,7 @@ * @return */ @Override public Result videoAvailabilityRate(DataCenterQuery params) { List<String> likeFileds = Arrays.asList("deviceId", "deviceName"); Query query = MongoUtil.getQuery(params, "createTime", likeFileds, null); @@ -808,11 +947,18 @@ long total = mongoTemplate.count(query, RecordMetaDSumResult.class); MongoUtil.setPage(query, params, "createTime"); List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class); //查询动态列数据 //查询动态列数据更具id查询 // List<DynamicColumnVO> dynamicColumnNames = dynamicColumnMapper.getDynamicColumnByTableName("uy_record_meta_d_sum"); //翻译行政区域 resultList.forEach(item -> { String areaCode = item.getArealayername().substring(0, 6); AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode); if (areaDeptEnum != null) item.setArealayername(areaDeptEnum.getName()); List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable("uy_record_meta_d_sum",item.getId()); item.setDynamicColumnList(list); }); // 统计数量 MongoDatabase database = mongoTemplate.getDb(); @@ -859,12 +1005,15 @@ resultCount.add(0, totalCount + ""); BigDecimal onlineRate = BigDecimal.ZERO; // 1:完整 0:间歇 -1:异常 | if (!StringUtils.isEmpty(resultCount.get(0)) && !"0".equals(resultCount.get(0))) { //resultCount.get(0) onlineRate = new BigDecimal(resultCount.get(1)).divide(new BigDecimal(resultCount.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100")); } resultCount.add(this.remove0(onlineRate)); HashMap<String, Object> map = new HashMap<>(); log.error("resultCount:{}",resultCount.get(3)); map.put("count", resultCount); map.put("list", resultList); return Result.ok().data(map).total(total); @@ -2973,6 +3122,10 @@ sampleCount = doc.getInteger("sampleCount"); expCount = doc.getInteger("expCount"); } //新构建聚合查询离线时间 List<String> countList = new ArrayList<>(); // 统计数 @@ -2995,6 +3148,8 @@ onlineRate = new BigDecimal(sampleCount-expCount).divide(new BigDecimal(sampleCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100")); } countList.add(this.remove0(onlineRate)); HashMap<String, Object> map = new HashMap<>(); map.put("count", countList); map.put("list", voList); ycl-server/src/main/java/com/ycl/platform/service/impl/DynamicColumnServiceImpl.java
@@ -33,6 +33,8 @@ private final static String TABLE_NAME = "t_yw_point"; /** * 添加 * @param form @@ -55,6 +57,23 @@ return Result.ok("添加成功"); } @Override public Result addByTableName(String tableName,DynamicColumnForm form) { Long num = new LambdaQueryChainWrapper<>(baseMapper) .eq(DynamicColumn::getLabelValue, form.getLabelValue()) .eq(DynamicColumn::getTableName, tableName) .count(); if (num > 0) { throw new RuntimeException("列名称不能重复"); } DynamicColumn entity = DynamicColumnForm.getEntityByForm(form, null); entity.setPropName(IdUtils.randomNO(new Date())); entity.setCreateTime(new Date()); entity.setTableName(tableName); baseMapper.insert(entity); return Result.ok("添加成功"); } /** * 修改 * @@ -68,6 +87,28 @@ } else { Long num = new LambdaQueryChainWrapper<>(baseMapper) .eq(DynamicColumn::getTableName, TABLE_NAME) .eq(DynamicColumn::getLabelValue, column.getLabelValue()) .ne(DynamicColumn::getId, column.getId()) .count(); if (num == 0) { new LambdaUpdateChainWrapper<>(baseMapper) .eq(DynamicColumn::getId, column.getId()) .set(DynamicColumn::getLabelValue, column.getLabelValue()) .update(); } } }); return Result.ok("保存成功"); } @Override public Result updateByTableName(String tableName, List<DynamicColumnForm> columnList) { columnList.stream().filter(item -> StringUtils.hasText(item.getLabelValue())).forEach(column -> { if (Objects.isNull(column.getId())) { this.addByTableName(tableName,column); } else { Long num = new LambdaQueryChainWrapper<>(baseMapper) .eq(DynamicColumn::getTableName, tableName) .eq(DynamicColumn::getLabelValue, column.getLabelValue()) .ne(DynamicColumn::getId, column.getId()) .count(); @@ -102,6 +143,20 @@ public Result all() { List<DynamicColumn> entities = new LambdaQueryChainWrapper<>(baseMapper) .orderByAsc(DynamicColumn::getCreateTime) .eq(DynamicColumn::getTableName,"t_yw_point") .list(); List<DynamicColumnVO> vos = entities.stream() .map(entity -> DynamicColumnVO.getVoByEntity(entity, null)) .collect(Collectors.toList()); return Result.ok().data(vos); } @Override public Result allByTableName(String tableName) { List<DynamicColumn> entities = new LambdaQueryChainWrapper<>(baseMapper) .eq(DynamicColumn::getTableName,tableName) .orderByAsc(DynamicColumn::getCreateTime) .list(); List<DynamicColumnVO> vos = entities.stream() .map(entity -> DynamicColumnVO.getVoByEntity(entity, null)) ycl-server/src/main/resources/mapper/zgyw/DynamicColumnMapper.xml
@@ -60,9 +60,9 @@ </select> <insert id="saveBatch"> insert into t_dynamic_column_value (dynamic_column_id,column_value,ref_id) values insert into t_dynamic_column_value (dynamic_column_id,column_value,ref_id,ref_string_id) values <foreach collection="insertList" item="item" separator=","> (#{item.dynamicColumnId},#{item.columnValue},#{item.refId}) (#{item.dynamicColumnId},#{item.columnValue},#{item.refId},#{item.refStringId}) </foreach> </insert> <update id="updateBatch"> @@ -91,4 +91,30 @@ #{id} </foreach> </select> <resultMap id="dynamicColumnMap" type="com.ycl.platform.domain.vo.DynamicColumnVO"> <result column="prop_name" property="propName"/> <result column="label_value" property="labelValue"/> <result column="column_value" property="columnValue"/> <result column="ref_string_id" property="refStringId"/> <result column="value_id" property="valueId"/> </resultMap> <select id="getDynamicColumnByTable" resultMap="dynamicColumnMap"> SELECT *, dcv.id as value_id FROM t_dynamic_column dc LEFT JOIN t_dynamic_column_value dcv ON dc.id = dcv.dynamic_column_id and dcv.ref_String_id = #{id} WHERE dc.table_name = #{tableName} </select> <select id="getDynamicColumnByTableName" resultMap="dynamicColumnMap"> select *,dcv.id as value_id from t_dynamic_column_value dcv left join t_dynamic_column dc on dc.id = dcv.dynamic_column_id where dc.table_name =#{tableName} </select> </mapper>