由于业务需要,前端传递已经配置好的sql,所以我需要实现一个通用的动态查询方案
controller
java//contorller
   @ApiOperation(value = "执行指定sql的脚本")
    @PostMapping("getSqlScriptExcuteResult")
    public Result<Object> getSqlScriptExcuteResult(@RequestBody @Validated RecSearchSolutionSqlScriptExcuteResultRequest request) {
        List<Map<String, Object>> map = iRecSearchSolutionService.getSqlScriptExcuteResult(request);
        return Result.success(map);
    }
service层
java//Service
    List<Map<String, Object>> getSqlScriptExcuteResult(RecSearchSolutionSqlScriptExcuteResultRequest request);
impl层
java//impl
@Override
    public List<Map<String, Object>> getSqlScriptExcuteResult(RecSearchSolutionSqlScriptExcuteResultRequest request) {
        if (request.getPage() != 0 && request.getRows() != 0) {
            Integer begin= (request.getPage()-1)*request.getRows();
            Integer end=request.getPage()*request.getRows();
            String newSql = MessageFormat.format("SELECT *\n" +
                    "  FROM (SELECT TMP.*, ROWNUM ROW_ID\n" +
                    "          FROM (" +
                    "{0}" +
                    ") TMP\n" +
                    "         WHERE ROWNUM <= {1})\n" +
                    " WHERE ROW_ID > {2}\n", request.getSql(),end,begin);
            request.setSql(newSql);
        }
        logger.info(request.getSql());
        List<Map<String, Object>> map = commonService.queryForMapList(request.getSql());
        for (Map<String,Object> m: map) {
            for (Map.Entry<String, Object> set:m.entrySet()) {
                if (set.getValue() instanceof Date){
                    set.setValue(DateUtil.format((Date)set.getValue(),"yyyy-MM-dd HH:mm:ss"));
                }
            }
        }
        return map;
    }
commonService
javapackage com.lhw.service;
import com.lhw.mapper.SqlHelperMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Service
public class CommonService {
    @Resource
    private JdbcTemplate jdbcTemplate;
    @Resource
    private SqlHelperMapper sqlHelperMapper;
    public String queryForString(String sql) {
        List<String> list = jdbcTemplate.queryForList(sql, String.class);
        if (list.size() == 0) {
            return "";
        } else {
            return list.get(0);
        }
    }
    public List<String> queryForStringArray(String sql) {
        List<String> list = jdbcTemplate.queryForList(sql, String.class);
        return list;
    }
    public List<Date> queryForDateArray(String sql) {
        List<Date> list = jdbcTemplate.queryForList(sql, Date.class);
        return list;
    }
    public Integer queryForInt(String sql) {
        List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class);
        if (list.size() == 0) {
            return 0;
        } else {
            return list.get(0);
        }
    }
    public Date queryForDate(String sql) {
        List<Date> list = jdbcTemplate.queryForList(sql, Date.class);
        if (list.size() == 0) {
            return new Date();
        } else {
            return list.get(0);
        }
    }
    public <T>  List<T> queryForList(String sql,Class<T> elementType ){
          List<T> list= jdbcTemplate.queryForList(sql, elementType);
          return list;
    }
    public <T> List<T> query(String sql,RowMapper<T> rowMapper){
        return jdbcTemplate.query(sql,rowMapper);
    }
    public List<LinkedHashMap<String, Object>> superSelect(String sql) {
        return sqlHelperMapper.superSelect(sql);
    }
    public Integer superSelectForInt(String sql) {
        return sqlHelperMapper.superSelectForInt(sql);
    }
    public List<Map<String, Object>> queryForMapList(String sql) {
        return jdbcTemplate.queryForList(sql);
    }
}
使用queryForList,会提示Incorrect column count: expected 1, actual 2,因为只支持返回一个list 所以我们就需要在commonService里调整,直接使用query
java    public List<SolutionConditionDictResponse> queryForDictList(String sql) {
        return jdbcTemplate.query(sql,BeanPropertyRowMapper.newInstance(SolutionConditionDictResponse.class));
    }
本文作者:Weee
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!