我在Java中有这个存储过程调用:
@Autowired
public ScoreDao(DataSource dataSource) {
setDataSource(dataSource);
mScoreStoredProcedure = new ScoreStoredProcedure(dataSource);
}
public List<Score> loadAllScore(String pUsername, String pUUID, int pLimit) {
return mScoreStoredProcedure.execute(pUsername, pUUID, pLimit);
}
private class ScoreStoredProcedure extends StoredProcedure {
private static final String SPROC_NAME = "loadUserScore";
public ScoreStoredProcedure(DataSource datasource) {
super(datasource, SPROC_NAME);
declareParameter(new SqlReturnResultSet("#result-set-2", mScoreMapper));
declareParameter(new SqlParameter("vusername", Types.VARCHAR));
declareParameter(new SqlParameter("vuuid", Types.VARCHAR));
declareParameter(new SqlParameter("vlimit", Types.INTEGER));
compile();
}
@SuppressWarnings("unchecked")
public List<Score> execute(String pUsername, String pUUID, int pLimit){
Map<String,Object> lAllScoreResult = super.execute(pUsername, pUUID, pLimit);
List<Score> lAllScore = ((List<Score>)lAllScoreResult.get("#result-set-2"));
return lAllScore;
}
}
和这个mapper类:
public class ScoreMapper implements RowMapper<Score> {
private String suffix = "";
@Autowired
private ScoreCreator scoreCreator;
@Autowired
private QuestionMapper questionMapper;
public ScoreMapper(String pSuffix) {
suffix = pSuffix;
}
public Score mapRow(ResultSet rs, int rowNum) throws SQLException {
Score lScore = scoreCreator.createScore(rs.getLong(suffix+"id"),
rs.getTimestamp(suffix+"stempel"), rs.getString(suffix+"username"),
rs.getInt(suffix+"points"), rs.getInt(suffix+"level"),
rs.getString(suffix+"comment"),
questionMapper.mapRow(rs, rowNum), rs.getString(suffix+"uuid"));
return lScore;
}
}
我遇到的问题是StoredProcedure
的结果永远不会转发给List<Score>
。
相反,它包含LinkedCaseInsensitiveMap<V>
的列表。每个条目都包含数据库中的值。
映射器通过Spring正确连线。
简单地说:我希望结果为List<Score>
。我以为我用代码中显示的方法来处理它。如何将结果直接投射到我的List<Score>
?
我遵循了本教程http://www.jtmelton.com/2007/10/30/using-springs-storedprocedure-and-rowmapper-mechanisms/
你能帮我找到问题吗?
答案 0 :(得分:3)
您可以将结果集参数重命名为“ScoreResultSet”吗?
所以
declareParameter(new SqlReturnResultSet("ScoreResultSet", mScoreMapper));
和
List<Score> lAllScore = ((List<Score>)lAllScoreResult.get("ScoreResultSet"));
当您自动为结果集生成名称时,春天会使用您当前使用的名称。
我认为您现在可能会返回一个与您声明的SqlReturnResultSet参数中的映射结果集不同的未处理结果集。
==
编辑:
我刚刚发现了你的另一个问题:Java StoredProcedure with SqlReturnResultSet not working并假设我们正在讨论相同的存储过程:
我怀疑你在存储过程中有两个选择,它返回两个结果集。 您应该声明两个(正确命名的)SqlReturnResultSet参数而不是一个。声明的顺序很重要,因此您不能只声明一个并给它通常分配给第二个的名称。
答案 1 :(得分:0)
尝试转换为LinkedList
而不是List<Score>
。
本教程如下所示,并且我唯一可以想到的是你做了与教程完全不同的事情:
List resultList = (LinkedList)results.get(Constants.RESULTSET);
//iterate of results list and print
for (Iterator it=resultList.iterator(); it.hasNext(); ) {
User user1 = (User)it.next();
System.out.println(user1);
}
return resultList;