I have 3 records in my database (for testing purposes) and I am using SQL_CALC_FOUND_ROWS to return the row count in conjunction with LIMIT to gather paginated results.
SELECT SQL_CALC_FOUND_ROWS * FROM contacts WHERE contacts.organizationId = :organizationId LIMIT 0, 1
I am using Spring to do my database business login as so.
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;
}
No matter what I do, the count comes back as 6, when I only have 3 rows in the table. In fact, it is returning 6 regardless of how many rows are in the resultset. Why is the number doubling, what I am doing wrong?
UPDATE
I ended up using this:
int count = namedParameterJdbcTemplate.queryForInt("SELECT Count(*) FROM contacts WHERE contacts.organizationId = :organizationId", namedParameters);
Basically the same as I was doing before but the SQL changed a little. I am now using count as opposed to SQL_CALC which I think results in two separate queries, but with Spring it seems to be the only way.
It looks like a side effect of using
SqlRowSet. Perhaps JDBC driver issues some queries internally to support it.If you don’t need specific features of
SqlRowSetit would be better to use more traditional approaches. For example, it would be better to useRowMapper<Contact>to query forList<Contact>.