我的数据库中有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;
}
无论我做什么,计数都会以6的形式返回,当时表中只有3行。实际上,无论结果集中有多少行,它都返回6。为什么数字加倍,我做错了什么?
更新
我最终使用了这个:
int count = namedParameterJdbcTemplate.queryForInt("SELECT Count(*) FROM contacts WHERE contacts.organizationId = :organizationId", namedParameters);
基本上和以前一样,但SQL改变了一点。我现在使用count而不是SQL_CALC,我认为这会导致两个单独的查询,但是使用Spring它似乎是唯一的方法。
答案 0 :(得分:0)
这看起来像使用SqlRowSet
的副作用。也许JDBC驱动程序在内部发出一些查询以支持它。
如果您不需要SqlRowSet
的特定功能,那么使用更传统的方法会更好。例如,最好使用RowMapper<Contact>
来查询List<Contact>
。
答案 1 :(得分:0)
这是一个古老的帖子,但是因为我在研究过程中遇到它并且这并不能完全满足我的需求,所以一旦我弄明白了,我就在这里写下了所有内容。 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 Connection中运行FOUND_ROWS()。这将确保返回的数据准确无误。