4

我在 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; 
    }

}

这个映射器类:

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;
}
  }

我遇到的问题是 my 的结果StoredProcedure永远不会转换为List<Score>.

相反,它包含一个LinkedCaseInsensitiveMap<V>. 每个条目涵盖数据库中的一个值。

映射器通过 Spring 正确连接。

简要地说:我期望结果是List<Score>. 我想我用代码中显示的方法来处理这个问题。如何将结果直接投射到我的List<Score>?

我按照本教程http://www.jtmelton.com/2007/10/30/using-springs-storedprocedure-and-rowmapper-mechanisms/

你能帮我找出问题吗?

4

2 回答 2

3

您能否将结果集参数重命名为“ScoreResultSet”?

所以

declareParameter(new SqlReturnResultSet("ScoreResultSet", mScoreMapper));

List<Score> lAllScore = ((List<Score>)lAllScoreResult.get("ScoreResultSet"));

当 spring 自动为结果集生成名称时,您当前使用的名称也会被使用。

因此,我认为您现在可能会返回一个与您声明的 SqlReturnResultSet 参数中映射的结果集不同的未处理结果集。

======

编辑:

我刚刚发现了您的另一个问题:Java StoredProcedure with SqlReturnResultSet not working,并假设我们正在谈论相同的存储过程:

我怀疑您在存储过程中有两个选择,它返回两个结果集。您应该声明两个(正确命名的)SqlReturnResultSet 参数而不是一个。声明的顺序很重要,所以你不能只声明一个并给它通常分配给第二个的名称。

于 2013-10-23T20:26:47.750 回答
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;
于 2013-10-14T21:22:59.473 回答