存储过程的结果集包含LinkedCaseInsensitiveMap <v> </v>的列表

时间:2013-10-14 20:15:04

标签: java spring spring-jdbc java-stored-procedures

我在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/

你能帮我找到问题吗?

2 个答案:

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