如何使用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
答案 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())));
我希望它有所帮助。