Java 存储过程的结果集包含LinkedCaseInsensitiveMap的列表<;V>;
我在Java中有一个存储过程调用: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
@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"));