【问题标题】:MySQL Found_Rows() Returns Double the Correct ValueMySQL Found_Rows() 返回正确值的两倍
【发布时间】:2018-01-06 22:12:34
【问题描述】:

我的数据库中有 3 条记录(用于测试目的),我正在使用 SQL_CALC_FOUND_ROWS 返回行数以及 LIMIT 以收集分页结果。

SELECT SQL_CALC_FOUND_ROWS * FROM contacts WHERE contacts.organizationId = :organizationId LIMIT 0, 1

我正在使用 Spring 进行数据库业务登录。

public List<Contact> findAll(int organizationId, int rowStart, int rowAmount, final boolean deep) {
    final HashMap<String, Object> namedParameters = new HashMap<String, Object>();
    namedParameters.put("organizationId", String.valueOf(organizationId));
    namedParameters.put("rowStart", rowStart);
    namedParameters.put("rowAmount", rowAmount);
    final NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
    TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);

    List<Contact> contactList = transactionTemplate.execute(new TransactionCallback<List<Contact>>() {

        @Override
        public List<Contact> doInTransaction(TransactionStatus status) {
            SqlRowSet result = namedParameterJdbcTemplate.queryForRowSet(SQL_FIND_ALL_BY_ORGANIZATION_ID, namedParameters);
            int count = namedParameterJdbcTemplate.queryForInt("SELECT FOUND_ROWS()", (HashMap<String, ?>) null);
            System.out.println(count);
            List<Contact> contactList = mapContact(result, deep);
            if(contactList.size() > 0) {
                return contactList;
            } else {
                return null;
            }
        }

    });
    return contactList;
}

无论我做什么,当我在表中只有 3 行时,计数都会返回 6。事实上,无论结果集中有多少行,它都会返回 6。为什么数量翻倍,我做错了什么?

更新

我最终使用了这个:

int count = namedParameterJdbcTemplate.queryForInt("SELECT Count(*) FROM contacts WHERE contacts.organizationId = :organizationId", namedParameters);

基本上和我之前做的一样,但是 SQL 稍微改变了一点。我现在使用 count 而不是 SQL_CALC,我认为这会导致两个单独的查询,但使用 Spring 似乎是唯一的方法。

【问题讨论】:

    标签: java mysql


    【解决方案1】:

    这看起来像是使用SqlRowSet 的副作用。也许 JDBC 驱动程序会在内部发出一些查询来支持它。

    如果您不需要SqlRowSet 的特定功能,最好使用更传统的方法。例如,最好使用RowMapper&lt;Contact&gt; 查询List&lt;Contact&gt;

    【讨论】:

      【解决方案2】:

      这是一个有点旧的帖子,但是由于我在研究时遇到它并且这并不能完全满足我的需求,所以一旦我弄清楚了,我就把所有东西都写在这里了。 https://www.contradodigital.com/2018/01/06/how-to-use-sql_calc_found_rows-and-found_rows-with-limit-and-offset-in-a-mysql-query-using-java-and-jdbc/

      本质上,要使 MySQL FOUND_ROWS() 工作,您需要在与第一个查询相同的 JDBC 连接中运行 FOUND_ROWS()。这将确保返回的数据是准确的。

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 2018-09-12
        • 2018-05-13
        • 2010-11-04
        • 1970-01-01
        相关资源
        最近更新 更多