2014-03-25 64 views
0

如何使用NameParameterJdbcTemplate分頁查詢?使用NameParameterJdbctemplate分頁查詢

我與必要的JdbcTemplate的努力,但我犯一些錯誤..這是我的查詢:

sql.append("SELECT VGPT_EXE.* FROM ") 
    .append(Constants.T_VW_GPT_E_BASIC) 
    .append(" AS VGPT_EXE ") 
    .append("WHERE VGPT_EXE.") 
    .append(Constants.ID_SUBJECTE 
    + " in (:listOfValues)"); 



    PreparedStatementCreatorFactory pscf; 
    MapSqlParameterSource parameterss = new MapSqlParameterSource(); 
    parameterss.addValue("listOfValues", ids); 
    pscf = new PreparedStatementCreatorFactory(sql.toString()); 
    pscf.setResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE); 

所以我相信在namedParameter查詢我不能二傳手列表值的問題?或者我做錯了。

resultat.setResultats((List<IDeute>) template.getJdbcOperations() 
           .query((PreparedStatementCreator) pscf.newPreparedStatementSetter(new ArrayList<Long>(parameterss.getValues().values())), 
           new ResultSetPaginatExtractor(new MapperDeute(), 
           resultat.getFiles(), 
           resultat.getInici()))); 

ResultSetPaginatExtractor是ResultSetExtractor的一個實現,我可以設置文件的數量和最前一頁一行。

堆棧跟蹤:

nested exception is org.springframework.dao.DataRetrievalFailureException: S'ha produit un error en la recuperació del deute associat a la clau de subjecte 3375876; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: SQL [SELECT VGPT_EXE.* FROM vw_gpt_e_basic AS VGPT_EXE WHERE VGPT_EXE.id_subjecte in (:listOfValues) ORDER BY VGPT_EXE.cc_cod_prov, VGPT_EXE.cc_cod_emisor, VGPT_EXE.cc_cod_concepte, VGPT_EXE.cc_any, VGPT_EXE.cc_periode, VGPT_EXE.cc_num_rebut]: given 1 parameters but expected 0 

回答

0

也似乎是在NamedParameterdJd錯誤..所以我改變的JdbcTemplate原件。

這是最後的代碼工作:

sql.append("SELECT VGPT_EXE.* FROM ") 
     .append(Constants.T_VW_GPT_E_BASIC) 
     .append(" AS VGPT_EXE ") 
     .append("WHERE VGPT_EXE.") 
     .append(Constants.ID_SUBJECTE 
     + " IN ("); 

for (int i = 0; i < ids.size(); i++) { 
    if (i > 0) { 
    sql.append(","); 
     } 
    sql.append("?");**for every dinamic id add an ?** 
    parametres.add(ids.get(i)); 
    tipusParametres.add(new SqlParameter(Types.INTEGER)); 
} 
    sql.append(")"); 
    sql.append(" AND VGPT_EXE." + Constants.ID_ENS_EXP + " = ? "); 
       parametres.add(idEns); 
       tipusParametres.add(new SqlParameter(Types.INTEGER)); 

       if (tipusDeute != null) { 
        if (tipusDeute.equals(ETipusDeute.HISTORIC)) { 
         sql.append(" AND " + Constants.DATA_FI_VOL 
           + " < TODAY "); 
        } 
        if (tipusDeute.equals(ETipusDeute.VIGENT)) { 
         sql.append(" AND " + Constants.DATA_FI_VOL 
           + " >= TODAY "); 
        } 
       } 
       // ordenació per la clau 
       sql.append(ORDER_BY_E); 
       try { 

       pscf = new PreparedStatementCreatorFactory(sql.toString()); 
       // El resultset HA DE SER DEL TIPUS TYPE_SCROLL_INSENSITIVE 
       pscf.setResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE); 
       for (SqlParameter sp : tipusParametres) { 
        pscf.addParameter(sp); 
       } 

       resultat.setResultats((List<IDeute>) template.getJdbcOperations().query(pscf.newPreparedStatementCreator(parametres.toArray()), new ResultSetPaginatExtractor(new MapperDeute(), 
         resultat.getFiles(), 
         resultat.getInici()))); 

我希望它能幫助宋。