私のデータベースには 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 が返されます。なぜ数が2倍になっているのですか、私が間違っているのは何ですか?
アップデート
私はこれを使用することになりました:
int count = namedParameterJdbcTemplate.queryForInt("SELECT Count(*) FROM contacts WHERE contacts.organizationId = :organizationId", namedParameters);
基本的には以前と同じですが、SQLが少し変わりました。私は今、2 つの別々のクエリになると思う SQL_CALC とは対照的に count を使用していますが、Spring ではそれが唯一の方法のようです。