1

私のデータベースには 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 ではそれが唯一の方法のようです。

4

2 に答える 2

0

使用の副作用のようSqlRowSetです。おそらく、JDBC ドライバーはそれをサポートするために内部的にいくつかのクエリを発行します。

特定の機能が必要ない場合は、SqlRowSetより伝統的なアプローチを使用することをお勧めします。たとえば、RowMapper<Contact>をクエリするために使用する方がよいでしょうList<Contact>

于 2012-04-24T13:11:15.357 に答える