Набор результатов хранимой процедуры содержит список LinkedCaseInsensitiveMap‹V›

У меня есть этот вызов хранимой процедуры в 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;
}
  }

У меня проблема в том, что результат моего StoredProcedure никогда не приводится к List<Score>.

Вместо этого он содержит список LinkedCaseInsensitiveMap<V>. Каждая запись охватывает значение из базы данных.

Mapper правильно подключен через Spring.

Вкратце: я ожидаю в результате List<Score>. Я думал, что справлюсь с этим с помощью методов, показанных в коде. Как я могу привести результат прямо к моему List<Score>?

Я следовал этому руководству http://www.jtmelton.com/2007/10/30/using-springs-storedprocedure-and-rowmapper-mechanisms/

Не могли бы вы помочь мне найти проблему?


person s_bei    schedule 14.10.2013    source источник
comment
Похоже, вы никогда не вызываете mapRow, вы просто переводите карту в список.   -  person aglassman    schedule 15.10.2013
comment
Да, мне это тоже интересно, но я следовал этому руководству jtmelton.com/2007/10/30/   -  person s_bei    schedule 15.10.2013
comment
Ах хорошо. Ну, зачеркните то, что я сказал о вызове mapRow, это должно использоваться только Spring API.   -  person aglassman    schedule 15.10.2013
comment
Если вы опубликуете код, где вы вызываете выполнение, это может быть полезно. Опубликованный код кажется правильным в соответствии с учебником.   -  person aglassman    schedule 15.10.2013
comment
какое выполнение вы имеете в виду? Я уже опубликовал выполнение StoredProcedure.   -  person s_bei    schedule 15.10.2013
comment
Код, из которого вы создаете экземпляр ScoreStoredProcedure, а затем вызываете его выполнение.   -  person aglassman    schedule 15.10.2013
comment
Вы получаете исключение, когда запускаете это?   -  person aglassman    schedule 15.10.2013
comment
нет. Я просто ожидаю, что spring сделает всю работу за меня и отобразит результат в List‹Score›   -  person s_bei    schedule 15.10.2013
comment
Как вы можете сказать, что код работает неправильно? Если он может привести к List‹Score›, я бы сказал, что он работает.   -  person aglassman    schedule 15.10.2013
comment
Я ожидаю, что в результате будет список баллов. Но я получаю список LinkedCaseSensitiveMap. Это факт. Если я попытаюсь разыграть одну из этих карт, я получу ClassCastException.   -  person s_bei    schedule 15.10.2013
comment
Кстати. Я никогда не говорил вам, что код работает неправильно. Я просто сказал, что это работает не так, как я ожидал   -  person s_bei    schedule 15.10.2013
comment
Каково содержание возвращенных LinkedCaseInsensitiveMaps?   -  person Timofey Gorshkov    schedule 21.10.2013
comment
Можете ли вы опубликовать детали хранимой процедуры?   -  person flup    schedule 24.10.2013
comment
К сожалению, не сейчас. Сегодня вечером   -  person s_bei    schedule 24.10.2013
comment
Кстати. установка имени набора результатов и сопоставления не имеет никакого эффекта. Вот почему я использую имя по умолчанию для набора результатов   -  person s_bei    schedule 24.10.2013


Ответы (2)


Можете ли вы переименовать параметр набора результатов, скажем, в «ScoreResultSet»?

So

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

и

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

Имя, которое вы используете в настоящее время, также используется Spring, когда оно автоматически генерирует имена для наборов результатов.

Я думаю, что теперь вы можете возвращать другой, необработанный набор результатов, чем сопоставленный из объявленного вами параметра SqlReturnResultSet.

======

РЕДАКТИРОВАТЬ:

Я только что нашел этот другой ваш вопрос: Java StoredProcedure с SqlReturnResultSet не работает и предполагая, что мы говорим об одной и той же хранимой процедуре:

Я подозреваю, что у вас есть два выбора в хранимой процедуре, и она возвращает два набора результатов. Вы должны объявить два (правильно названных) параметра SqlReturnResultSet вместо одного. Порядок объявления имеет значение, поэтому вы не можете объявить только один и дать ему имя, обычно присваиваемое второму.

person flup    schedule 23.10.2013
comment
Ты был прав. У меня есть 3 выбора внутри моего Sp. Установка свойств в правильном порядке приводит к ожидаемому результату. Большое спасибо! - person s_bei; 24.10.2013
comment
Пожалуйста, помогите мне с почти такой же проблемой stackoverflow.com/q/30378061/2323234 - person MRK187; 21.05.2015

Попробуйте выполнить приведение к 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;
person aglassman    schedule 14.10.2013
comment
приведение к LinkedList не может помочь, так как LinkedList не имеет дополнительных методов, которых нет в интерфейсе List - person Sean Patrick Floyd; 17.10.2013