2013-04-22 13 views
7

मैं संग्रहीत प्रक्रियाओं/एसक्यूएल से कई परिणाम सेट लौटने का एक आसान तरीका खोजने का प्रयास कर रहा हूं। मैं SimpleJdbcOperations#queryForList() विधि का उपयोग कर रहा हूं हालांकि यह केवल List<Map<String, Object>> के रूप में पहला परिणाम सेट लौटाएगा। मुझे या के रूप में आदर्श रूप से एकाधिक परिणाम सेट प्राप्त करने में सक्षम होना चाहिए। जो प्रोग्राम मैं लिख रहा हूं वह एक मिडलवेयर घटक है इसलिए मुझे नहीं पता कि एसक्यूएल क्या होगा, या परिणाम सेट का रूप।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

एक [ 'ResultSet'] के रूप http://docs.oracle.com/javase/7/docs/api/java में ResultSet की सूची प्राप्त करने के लिए विधि नीचे का इस्तेमाल किया है /sql/ResultSet.html) पंक्तियों को शामिल करता है क्योंकि आप सीधे डेटाबेस पर एसक्यूएल निष्पादित करने के बाद उन्हें पा सकते हैं, यह कभी भी 'सूची >' वापस नहीं करेगा। आपको इसे 'परिणामसेट' में फ़ील्ड के साथ स्वयं उत्पन्न करना होगा, जिसे आप गेटर्स के साथ एक्सेस कर सकते हैं। –

+0

मुझे 'हैसक्स्ट()' और 'getObject()' का उपयोग करके 'परिणामसेट' को फिर से चलाने में सक्षम होना चाहिए? –

+0

आप 'अगली') के साथ 'while' लूप का उपयोग करेंगे और विभिन्न गेटर्स के साथ विभिन्न पंक्ति फ़ील्ड प्राप्त करेंगे। –

उत्तर

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

को 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

मैं (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; 
      } 
     }); 
    } 
संबंधित मुद्दे