2012-04-24 106 views
1

我有我的數據庫中的3條記錄(用於測試目的),我正在使用SQL_CALC_FOUND_ROWS返回與LIMIT結合的行數來收集分頁結果。MySQL Found_Rows()返回雙正確值

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。爲什麼數字翻倍,我做錯了什麼?

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()正常工作,您需要在與第一個查詢相同的JDBC連接中運行FOUND_ROWS()。這將確保返回的數據是準確的。