如何为具体查询设置 fetchSize?

Posted

技术标签:

【中文标题】如何为具体查询设置 fetchSize?【英文标题】:How to set fetchSize for concrete query? 【发布时间】:2019-03-23 20:54:09 【问题描述】:

我只想为一个查询设置 fetchSize,但我找不到合适的 api。

我的代码如下所示:

jdbcTemplate.query(query, new RowCallbackHandler() 
            @Override
            public void processRow(ResultSet rs) throws SQLException ...
);

如何将 fetchSize 传递给查询?

【问题讨论】:

【参考方案1】:

这可以使用PreparedStatementSetter (JavaDoc) 给定查询

select * from mytable where user_id > ?

你可以使用

jdbcTemplate.query(query, 
    new PreparedStatementSetter() 
       @Override
       public void setValues(final PreparedStatement ps) throws SQLException 
           ps.setInt(1, userId);
           ps.setFetchSize(500);
       
    , 
    new RowCallbackHandler() 
       @Override
       public void processRow(final ResultSet rs) throws SQLException 
         ...
       
    );  

或者以更紧凑的形式

jdbcTemplate.query(
      query, 
      ps ->  
         ps.setInt(1, userId);
         ps.setFetchSize(500);
      ,
      rs ->  ... 
);

请记住

实现负责设置任何必要的参数。 已经提供了带占位符的 SQL。


对于单个结果对象,使用

public <T> T query(String sql,
                   PreparedStatementSetter pss,
                   ResultSetExtractor<T> rse) throws DataAccessException;

方法。例如

jdbcTemplate.query(
    query,
    new ArgumentPreparedStatementSetter(new Object[] balanceId),
    rs -> 
       final String field1 = rs.getString("field1");
       // Get other fields and construct the resulting object
       return new YourClass(field1, ...);
    
);

【讨论】:

看起来很完美! @g*** 问题是我从未见过使用它的教程。这就是为什么它在文档中如此“隐藏”。 @g*** btw,记住你需要手动设置值。 什么意思? 您的建议 ps.setInt(1, userId) 对我很有帮助。感谢您的努力

以上是关于如何为具体查询设置 fetchSize?的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis常见疑问

如何为 mysql 设置 ActiveRecord 查询超时?

如何在内存数据库中设置 fetchSize?

如何为查询执行设置语句超时

如何为过去 3 个月的每个日期运行查询

如何为 ButtonGroup 内的 MUI 按钮设置悬停行为