102102 * @author Rod Johnson
103103 * @author Juergen Hoeller
104104 * @author Thomas Risberg
105+ * @author Yanming Zhou
105106 * @since May 3, 2001
106107 * @see JdbcOperations
107108 * @see PreparedStatementCreator
@@ -493,12 +494,12 @@ public String getSql() {
493494
494495 @ Override
495496 public void query (String sql , RowCallbackHandler rch ) throws DataAccessException {
496- query (sql , new RowCallbackHandlerResultSetExtractor (rch ));
497+ query (sql , new RowCallbackHandlerResultSetExtractor (rch , this . maxRows ));
497498 }
498499
499500 @ Override
500501 public <T > List <T > query (String sql , RowMapper <T > rowMapper ) throws DataAccessException {
501- return result (query (sql , new RowMapperResultSetExtractor <>(rowMapper )));
502+ return result (query (sql , new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
502503 }
503504
504505 @ Override
@@ -508,7 +509,7 @@ class StreamStatementCallback implements StatementCallback<Stream<T>>, SqlProvid
508509 public Stream <T > doInStatement (Statement stmt ) throws SQLException {
509510 ResultSet rs = stmt .executeQuery (sql );
510511 Connection con = stmt .getConnection ();
511- return new ResultSetSpliterator <>(rs , rowMapper ).stream ().onClose (() -> {
512+ return new ResultSetSpliterator <>(rs , rowMapper , JdbcTemplate . this . maxRows ).stream ().onClose (() -> {
512513 JdbcUtils .closeResultSet (rs );
513514 JdbcUtils .closeStatement (stmt );
514515 DataSourceUtils .releaseConnection (con , getDataSource ());
@@ -773,12 +774,12 @@ private String appendSql(@Nullable String sql, String statement) {
773774
774775 @ Override
775776 public void query (PreparedStatementCreator psc , RowCallbackHandler rch ) throws DataAccessException {
776- query (psc , new RowCallbackHandlerResultSetExtractor (rch ));
777+ query (psc , new RowCallbackHandlerResultSetExtractor (rch , this . maxRows ));
777778 }
778779
779780 @ Override
780781 public void query (String sql , @ Nullable PreparedStatementSetter pss , RowCallbackHandler rch ) throws DataAccessException {
781- query (sql , pss , new RowCallbackHandlerResultSetExtractor (rch ));
782+ query (sql , pss , new RowCallbackHandlerResultSetExtractor (rch , this . maxRows ));
782783 }
783784
784785 @ Override
@@ -799,28 +800,28 @@ public void query(String sql, RowCallbackHandler rch, @Nullable Object @Nullable
799800
800801 @ Override
801802 public <T > List <T > query (PreparedStatementCreator psc , RowMapper <T > rowMapper ) throws DataAccessException {
802- return result (query (psc , new RowMapperResultSetExtractor <>(rowMapper )));
803+ return result (query (psc , new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
803804 }
804805
805806 @ Override
806807 public <T > List <T > query (String sql , @ Nullable PreparedStatementSetter pss , RowMapper <T > rowMapper ) throws DataAccessException {
807- return result (query (sql , pss , new RowMapperResultSetExtractor <>(rowMapper )));
808+ return result (query (sql , pss , new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
808809 }
809810
810811 @ Override
811812 public <T > List <T > query (String sql , @ Nullable Object @ Nullable [] args , int [] argTypes , RowMapper <T > rowMapper ) throws DataAccessException {
812- return result (query (sql , args , argTypes , new RowMapperResultSetExtractor <>(rowMapper )));
813+ return result (query (sql , args , argTypes , new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
813814 }
814815
815816 @ Deprecated (since = "5.3" )
816817 @ Override
817818 public <T > List <T > query (String sql , @ Nullable Object @ Nullable [] args , RowMapper <T > rowMapper ) throws DataAccessException {
818- return result (query (sql , newArgPreparedStatementSetter (args ), new RowMapperResultSetExtractor <>(rowMapper )));
819+ return result (query (sql , newArgPreparedStatementSetter (args ), new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
819820 }
820821
821822 @ Override
822823 public <T > List <T > query (String sql , RowMapper <T > rowMapper , @ Nullable Object @ Nullable ... args ) throws DataAccessException {
823- return result (query (sql , newArgPreparedStatementSetter (args ), new RowMapperResultSetExtractor <>(rowMapper )));
824+ return result (query (sql , newArgPreparedStatementSetter (args ), new RowMapperResultSetExtractor <>(rowMapper , 0 , this . maxRows )));
824825 }
825826
826827 /**
@@ -845,7 +846,7 @@ public <T> Stream<T> queryForStream(PreparedStatementCreator psc, @Nullable Prep
845846 }
846847 ResultSet rs = ps .executeQuery ();
847848 Connection con = ps .getConnection ();
848- return new ResultSetSpliterator <>(rs , rowMapper ).stream ().onClose (() -> {
849+ return new ResultSetSpliterator <>(rs , rowMapper , this . maxRows ).stream ().onClose (() -> {
849850 JdbcUtils .closeResultSet (rs );
850851 if (pss instanceof ParameterDisposer parameterDisposer ) {
851852 parameterDisposer .cleanupParameters ();
@@ -1364,7 +1365,7 @@ protected Map<String, Object> processResultSet(
13641365 }
13651366 else if (param .getRowCallbackHandler () != null ) {
13661367 RowCallbackHandler rch = param .getRowCallbackHandler ();
1367- (new RowCallbackHandlerResultSetExtractor (rch )).extractData (rs );
1368+ (new RowCallbackHandlerResultSetExtractor (rch , - 1 )).extractData (rs );
13681369 return Collections .singletonMap (param .getName (),
13691370 "ResultSet returned from stored procedure was processed" );
13701371 }
@@ -1747,13 +1748,17 @@ private static class RowCallbackHandlerResultSetExtractor implements ResultSetEx
17471748
17481749 private final RowCallbackHandler rch ;
17491750
1750- public RowCallbackHandlerResultSetExtractor (RowCallbackHandler rch ) {
1751+ private final int maxRows ;
1752+
1753+ public RowCallbackHandlerResultSetExtractor (RowCallbackHandler rch , int maxRows ) {
17511754 this .rch = rch ;
1755+ this .maxRows = maxRows ;
17521756 }
17531757
17541758 @ Override
17551759 public @ Nullable Object extractData (ResultSet rs ) throws SQLException {
1756- while (rs .next ()) {
1760+ int processed = 0 ;
1761+ while (rs .next () && (this .maxRows == -1 || (processed ++) < this .maxRows )) {
17571762 this .rch .processRow (rs );
17581763 }
17591764 return null ;
@@ -1771,17 +1776,20 @@ private static class ResultSetSpliterator<T> implements Spliterator<T> {
17711776
17721777 private final RowMapper <T > rowMapper ;
17731778
1779+ private final int maxRows ;
1780+
17741781 private int rowNum = 0 ;
17751782
1776- public ResultSetSpliterator (ResultSet rs , RowMapper <T > rowMapper ) {
1783+ public ResultSetSpliterator (ResultSet rs , RowMapper <T > rowMapper , int maxRows ) {
17771784 this .rs = rs ;
17781785 this .rowMapper = rowMapper ;
1786+ this .maxRows = maxRows ;
17791787 }
17801788
17811789 @ Override
17821790 public boolean tryAdvance (Consumer <? super T > action ) {
17831791 try {
1784- if (this .rs .next ()) {
1792+ if (this .rs .next () && ( this . maxRows == - 1 || this . rowNum < this . maxRows ) ) {
17851793 action .accept (this .rowMapper .mapRow (this .rs , this .rowNum ++));
17861794 return true ;
17871795 }
0 commit comments