diff --git a/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java b/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java index 9452abfd..c9f127cd 100644 --- a/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java +++ b/src/main/java/org/ssssssss/magicapi/modules/SQLModule.java @@ -352,7 +352,7 @@ public class SQLModule extends HashMap 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> list = null; if (count > 0) { BoundSql pageBoundSql = buildPageBoundSql(dialect, boundSql, page.getOffset(), page.getLimit()); @@ -368,7 +368,7 @@ public class SQLModule extends HashMap 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 implements MagicModule return boundSql.getCacheValue(this.sqlInterceptors, () -> { Dialect dialect = dataSourceNode.getDialect(dialectAdapter); BoundSql pageBoundSql = buildPageBoundSql(dialect, boundSql, 0, 1); - List> 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 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()); }); } diff --git a/src/main/java/org/ssssssss/magicapi/modules/SingleRowResultSetExtractor.java b/src/main/java/org/ssssssss/magicapi/modules/SingleRowResultSetExtractor.java new file mode 100644 index 00000000..a7924d9e --- /dev/null +++ b/src/main/java/org/ssssssss/magicapi/modules/SingleRowResultSetExtractor.java @@ -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 implements ResultSetExtractor{ + + + private final boolean singleColumn; + + private final RowMapper mapper; + + private final Class requiredType; + + public SingleRowResultSetExtractor(RowMapper mapper) { + this(mapper, null, false); + } + + public SingleRowResultSetExtractor(Class requiredType) { + this(null, requiredType, true); + } + + private SingleRowResultSetExtractor(RowMapper mapper, Class 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; + } +}