使用NameParameterJdbctemplate分隔查询

时间:2014-03-25 08:04:00

标签: java spring pagination informix jdbctemplate

如何使用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的一个实现,我可以在其中设置文件数和fisrt行。

stackTrace:

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

1 个答案:

答案 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())));

我希望它有所帮助。