2013-04-22 2 views
7

Я пытаюсь найти простой способ справиться с хранимыми процедурами/SQL, возвращающими несколько наборов результатов. Я использовал метод SimpleJdbcOperations#queryForList(), но это вернет только первый набор результатов как List<Map<String, Object>>. Мне нужно иметь возможность получить несколько наборов результатов, в идеале, как CollectionList<Map<String, Object>> или что-то в этом роде. Программа, которую я пишу, представляет собой компонент промежуточного программного обеспечения, поэтому я не знаю, что такое SQL, или форма набора результатов.JdbcTemplate несколько наборов результатов

Я думаю, что я должен использовать класс JdbcOperations, который дает мне доступ к большему количеству методов, включая execute(CallableStatementCreator csc, CallableStatementCallback<T> action), но теперь я застрял.

CallableStatementCallback<T> callback = new CallableStatementCallback<T>() { 
     @Override 
     public T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException 
     { 
      boolean results = cs.execute(request); 
      while(results) 
      { 
       ResultSet result = cs.getResultSet(); 
       results = cs.getMoreResults(); 
      } 
      return null; 
     } 
}; 

Я не совсем уверен, как использовать метод, хотя, или что делать с ResultSet, чтобы мои общие List<Map<String, Object>> с.

+0

A [ 'ResultSet'] (http://docs.oracle.com/javase/7/docs/api/java /sql/ResultSet.html) содержит строки, которые вы могли бы найти после выполнения SQL непосредственно в базе данных, он никогда не вернет «Список >». Вы должны сгенерировать его самостоятельно с полями в 'ResultSet', с которыми вы можете получить доступ с помощью геттеров. –

+0

Я должен иметь возможность выполнять итерацию 'ResultSet' с помощью' hasNext() 'и' getObject() '? –

+0

Вы должны использовать цикл while в 'next()' и получать разные поля строк с различными геттерами. –

ответ

2

мне удалось получить Set<ResultSet> с помощью этого кода,

private Set<ResultSet> executeProcedure(final String sql) 
{ 
    return jdbc.execute(new CallableStatementCreator() { 
     @Override 
     public CallableStatement createCallableStatement(Connection con) throws SQLException 
     { 
      return con.prepareCall(sql); 
     } 
    }, new CallableStatementCallback<Set<ResultSet>>() { 
     @Override 
     public Set<ResultSet> doInCallableStatement(CallableStatement cs) throws SQLException 
     { 
      Set<ResultSet> results = new HashSet<>(); 

      boolean resultsAvailable = cs.execute(); 

      while (resultsAvailable) 
      { 
       results.add(cs.getResultSet()); 
       resultsAvailable = cs.getMoreResults(); 
      } 
      return results; 
     } 
    }); 
} 

Просто перейдя на перевод ResultSet на номер List<Map<String, Object>>.

+0

Привет. Это может быть альтернативой для вас: http://stackoverflow.com/a/15926687/166589 –

1

Вы можете использовать метод resultSet.getMetaData(), чтобы выяснить, что столбцы в данных:

ResultSetMetaData meta = resultSet.getMetaData(); 
int colcount = meta.getColumnCount(); 
for (int i = 1; i <= colcount; i++) 
{ 
    String name = meta.getColumnLabel(i); // This is the name of the column 
    int type = meta.getColumnType(i);  // from java.sql.Types 
    // Maybe add to a Map,List, etc... 
} 

Вы можете сделать, как и другие commentors упоминали сделать петлю через ResultSet вытаскивания данные вам необходимо:

while (resultSet.hasNext()) 
{ 
    resultSet.next(); 
    // Find the columns you want to extract (via the above method maybe) and add to your row. 
} 
+0

О, круто спасибо :) Я искал способ получить количество столбцов. –

0

Я использовал метод ниже, чтобы получить список ResultSet в виде List<Map<String, Object>>

public List<List<Map<String, Object>>> executeProcedure(final String sql) { 
     return jdbcTemplate.execute(new CallableStatementCreator() { 
      @Override 
      public CallableStatement createCallableStatement(Connection con) throws SQLException { 
       return con.prepareCall(sql); 
      } 
     }, new CallableStatementCallback<List<List<Map<String, Object>>>>() { 
      @Override 
      public List<List<Map<String, Object>>> doInCallableStatement(CallableStatement cs) throws SQLException { 
       boolean resultsAvailable = cs.execute(); 
       List<List<Map<String, Object>>> list = new ArrayList<List<Map<String, Object>>>(); 
       while (resultsAvailable) { 
        ResultSet resultSet = cs.getResultSet(); 
        List<Map<String, Object>> subList = new ArrayList<Map<String, Object>>(); 
        while (resultSet.next()) { 
         ResultSetMetaData meta = resultSet.getMetaData(); 
         int colcount = meta.getColumnCount(); 
         Map<String, Object> map = new HashMap<String, Object>(); 
         for (int i = 1; i <= colcount; i++) { 
          String name = meta.getColumnLabel(i); 
          map.put(name, resultSet.getString(i)); 
         } 
         subList.add(map); 
        } 
        list.add(subList); 
        resultsAvailable = cs.getMoreResults(); 
       } 
       return list; 
      } 
     }); 
    }