Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存储过程的结果集包含LinkedCaseInsensitiveMap的列表<;V>;_Java_Spring_Spring Jdbc_Java Stored Procedures - Fatal编程技术网

Java 存储过程的结果集包含LinkedCaseInsensitiveMap的列表<;V>;

Java 存储过程的结果集包含LinkedCaseInsensitiveMap的列表<;V>;,java,spring,spring-jdbc,java-stored-procedures,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

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

}
@Autowired
公共ScoreDao(数据源数据源){
setDataSource(数据源);
mscorestoredprocesdure=新的scorestoredprocesdure(数据源);
}
公共列表loadAllScore(字符串pUsername、字符串pUUID、int pLimit){
返回mscorestoredprocesdure.execute(pUsername、pUUID、pLimit);
}
私有类ScoreStoredProcess扩展了StoredProcess{
私有静态最终字符串存储过程\u NAME=“loadUserScore”;
公共ScoreStoredProcess(数据源数据源){
超级(数据源、存储过程名称);
declareParameter(新的SqlReturnResultSet(“结果集-2”,mScoreMapper));
declareParameter(新的SqlParameter(“Vuser名称”,Types.VARCHAR));
declareParameter(新的SqlParameter(“vuid”,Types.VARCHAR));
declareParameter(新的SqlParameter(“vlimit”,Types.INTEGER));
编译();
}
@抑制警告(“未选中”)
公共列表执行(字符串pUsername、字符串pUUID、int pLimit){
Map lallscoresult=super.execute(pUsername、pUUID、pLimit);
List lAllScore=((List)lallscoresult.get(“#result-set-2”);
返回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;
}
  }
公共类ScoreMapper实现行映射器{
私有字符串后缀=”;
@自动连线
私人计分器计分器;
@自动连线
私人问题映射器问题映射器;
公共记分器(字符串pSuffix){
后缀=pSuffix;
}
公共分数映射行(结果集rs,int rowNum)抛出SQLException{
Score lScore=scoreCreator.createScore(rs.getLong(后缀+“id”),
rs.getTimestamp(后缀+“stempel”)、rs.getString(后缀+“用户名”),
rs.getInt(后缀+“点数”)、rs.getInt(后缀+“级别”),
rs.getString(后缀+注释),
mapRow(rs,rowNum),rs.getString(后缀+“uuid”);
返回lScore;
}
}
我遇到的问题是,我的
storedProcess
的结果从未强制转换到
列表

相反,它包含一个
LinkedCaseInsensitiveMap
列表。每个条目包含数据库中的一个值

映射器通过弹簧正确连接

简而言之:我希望结果是一个
列表
。我想我用代码中显示的方法来处理这个问题。如何将结果直接强制转换到我的
列表

我遵循了这个教程


你能帮我找到问题吗?

尝试转换到
链接列表
,而不是
列表

本教程如下所示,这是我能想到的唯一一件与本教程不同的事情:

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;

能否将结果集参数重命名为,比如“ScoreResultSet”

所以

List lAllScore=((List)lallscoresult.get(“scoresultset”);
当spring自动生成结果集的名称时,您当前使用的名称也会被spring使用

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

======

编辑:

我刚刚发现了您的另一个问题:假设我们讨论的是同一个存储过程:

我怀疑存储过程中有两个select,它返回两个结果集。
您应该声明两个(正确命名)SqlReturnResultSet参数,而不是一个。声明的顺序很重要,因此您不能只声明一个,而给它通常指定给第二个的名称。

看起来您从来没有调用mapRow,您只是将地图强制转换为列表。是的,我也很想知道,但我遵循了本教程啊,好的。好吧,请注意我所说的调用mapRow,这应该只由SpringAPI使用。如果您在调用execute的地方发布代码,这可能会有所帮助。根据教程,发布的代码似乎是正确的。你指的是哪种执行?我已经发布了StoredProcedure执行。强制转换到LinkedList没有帮助,因为LinkedList没有其他方法列表界面没有你是对的。我的Sp中有3个选项。按正确的顺序设置属性可以获得预期的结果。太多了!请帮我解决几乎相同的问题
declareParameter(new SqlReturnResultSet("ScoreResultSet", mScoreMapper));
List<Score> lAllScore = ((List<Score>)lAllScoreResult.get("ScoreResultSet"));