修复Oracle查询单行单列值时,返回值带有ROW_ID的问题

This commit is contained in:
mxd
2021-05-19 20:20:08 +08:00
parent 6e9e8c9de8
commit ff620bc58c
2 changed files with 49 additions and 5 deletions

View File

@@ -352,7 +352,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
private Object page(BoundSql boundSql, Page page) {
Dialect dialect = dataSourceNode.getDialect(dialectAdapter);
BoundSql countBoundSql = boundSql.copy(dialect.getCountSql(boundSql.getSql()));
int count = countBoundSql.getCacheValue(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().queryForObject(countBoundSql.getSql(), Integer.class, countBoundSql.getParameters()));
int count = countBoundSql.getCacheValue(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().query(countBoundSql.getSql(), new SingleRowResultSetExtractor<>(Integer.class), countBoundSql.getParameters()));
List<Map<String, Object>> list = null;
if (count > 0) {
BoundSql pageBoundSql = buildPageBoundSql(dialect, boundSql, page.getOffset(), page.getLimit());
@@ -368,7 +368,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
@Comment("查询int值适合单行单列int的结果")
public Integer selectInt(@Comment("`SQL`语句") String sql) {
BoundSql boundSql = new BoundSql(sql, this);
return boundSql.getCacheValue(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().queryForObject(boundSql.getSql(), boundSql.getParameters(), Integer.class));
return boundSql.getCacheValue(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().query(boundSql.getSql(),new SingleRowResultSetExtractor<>(Integer.class), boundSql.getParameters()));
}
/**
@@ -384,8 +384,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return boundSql.getCacheValue(this.sqlInterceptors, () -> {
Dialect dialect = dataSourceNode.getDialect(dialectAdapter);
BoundSql pageBoundSql = buildPageBoundSql(dialect, boundSql, 0, 1);
List<Map<String, Object>> list = dataSourceNode.getJdbcTemplate().query(pageBoundSql.getSql(), this.columnMapRowMapper, pageBoundSql.getParameters());
return list.size() > 0 ? list.get(0) : null;
return dataSourceNode.getJdbcTemplate().query(pageBoundSql.getSql(), new SingleRowResultSetExtractor<>(this.columnMapRowMapper), pageBoundSql.getParameters());
});
}
@@ -398,7 +397,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return boundSql.getCacheValue(this.sqlInterceptors, () -> {
Dialect dialect = dataSourceNode.getDialect(dialectAdapter);
BoundSql pageBoundSql = buildPageBoundSql(dialect, boundSql, 0, 1);
return dataSourceNode.getJdbcTemplate().queryForObject(pageBoundSql.getSql(), Object.class, pageBoundSql.getParameters());
return dataSourceNode.getJdbcTemplate().query(pageBoundSql.getSql(), new SingleRowResultSetExtractor<>(Object.class), pageBoundSql.getParameters());
});
}

View File

@@ -0,0 +1,45 @@
package org.ssssssss.magicapi.modules;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.JdbcUtils;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SingleRowResultSetExtractor<T> implements ResultSetExtractor<T>{
private final boolean singleColumn;
private final RowMapper<T> mapper;
private final Class<T> requiredType;
public SingleRowResultSetExtractor(RowMapper<T> mapper) {
this(mapper, null, false);
}
public SingleRowResultSetExtractor(Class<T> requiredType) {
this(null, requiredType, true);
}
private SingleRowResultSetExtractor(RowMapper<T> mapper, Class<T> requiredType, boolean singleColumn) {
this.mapper = mapper;
this.requiredType = requiredType;
this.singleColumn = singleColumn;
}
@Override
@SuppressWarnings("unchecked")
public T extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
if(singleColumn){
return (T) JdbcUtils.getResultSetValue(rs, 1, requiredType);
}
return mapper.mapRow(rs, 0);
}
return null;
}
}