如何使用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发布于 2014-03-25 12:38:30
嗯,似乎是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())));我希望这能帮上忙。
https://stackoverflow.com/questions/22628572
复制相似问题