2012-04-24 5 views
1

У меня есть 3 записи в моей базе данных (для целей тестирования), и я использую SQL_CALC_FOUND_ROWS, чтобы возвращать число строк вместе с LIMIT для сбора разбитых на страницы результатов.MySQL Found_Rows() Возвращает Double the Correct Value

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 независимо от количества строк в наборе результатов. Почему удвоение числа, что я делаю неправильно?

UPDATE

Я закончил с использованием этого:

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

В основном так же, как я делал раньше, но SQL немного изменилось. Теперь я использую count, а не SQL_CALC, который, по моему мнению, приводит к двум отдельным запросам, но с Spring это единственный способ.

ответ

0

Похоже на побочный эффект использования SqlRowSet. Возможно, драйвер JDBC вызывает внутренние запросы для поддержки.

Если вам не нужны конкретные функции SqlRowSet, было бы лучше использовать более традиционные подходы. Например, было бы лучше использовать RowMapper<Contact> для запроса для List<Contact>.

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() необходимо запустить FOUND_ROWS() в рамках одного и того же соединения JDBC в качестве первого запроса. Это обеспечит точность возвращаемых данных.

Смежные вопросы