Usando una consulta dentro de RowMapper

En java, haría algo como a continuación para iterar el set de resultset y formar la consulta,

 public Map<String, List<MODEL>> fun(){ Map<String, List<MODEL>> map = new TreeMap<String, List<MODEL>>(); LinkedHashSet<String> set = new LinkedHashSet<String>(); String sql = "select distinct(column) from table where conditions orderby column "; ResultSet rslt = stmt.executeQuery(sql); while (rslt.next()) { al.add(rslt.getString(1)); } for (String s : al) { List<MODEL> list = new ArrayList<MODEL>(); String sql2 = "select * from table where column="+s; ResultSet rslt2 = stmt.executeQuery(sql2); while (rslt2.next()) { MODEL obj = new MODEL(); // set values to setters from resultset list.add(obj); } map.put(s, list); } return map; } 

La razón por la que he usado la consulta por separado es que estoy agregando los valores distintos a la key del map y sus valores correspondientes (como Lista) a los valores del map. NOTA (En el resultado tiene valores duplicates de la columna1 ), pero necesito almacenarlos como key del map y, por lo tanto, hacerlo único. también necesito todos sus valores asociados para completar una list

¿Cómo puedo lograr la misma funcionalidad usando JdbcTemplate ,

Gracias por adelantado

Como dijo @geoand, lo mejor (ya sea en código JDBC directo o usando JDBCTemplate) sería hacer una sola consulta con un Join.

Sin embargo, si como mencionaste en los comentarios, estás absolutamente seguro de que el set de resultados de la primera consulta siempre será pequeño (dudoso), entonces podrías almacenar los valores recuperados de la primera consulta en una list, y luego hacer un segunda consulta con una cláusula "in", usando la list como parámetro. Esto daría lugar a dos consultas.

En cualquier caso, realmente no desea hacer una consulta por separado para cada elemento devuelto desde la primera consulta, ya que será bastante lento, incluso para pequeñas cantidades de elementos. Pero, si cree que debe hacerlo , almacene los resultados de la primera consulta en una list y luego emita otra consulta para cada elemento de la list.

TLDR; No, JDBCTemplate no proporciona un mecanismo para hacer lo que usted desea, principalmente porque generalmente se considera un ejemplo canónico de un patrón de progtwigción de progtwigción.

Según lo manifestado por varias personas, su solución no es eficiente, aunque podría funcionar, básicamente está cayendo en la trampa del problema de selección 1 + N. 1 consulta para recuperar alguna identificación y luego para cada identificación otra consulta (por lo tanto, 1 + N seleccionar).

Sería mejor simplemente escribir una sola consulta que recupere todo de una vez. En cuanto a su código, tiene las siguientes 2 consultas que, según parece, operan en la misma tabla.

 String sql1 = "select distinct(column) from table where conditions orderby column "; String sql2 = "select * from table where column="+s 

Ahora puede hacer que la primera consulta sea una subselección para la segunda consulta

 String sql = "select * from table where column in (select distinct(column) from table where conditions) order by column"; 

Sin embargo, de nuevo por lo que parece, también sería posible (o tal vez incluso más fácil) simplemente poner la cláusula where en su segunda consulta.

 String sql = "select * from table where conditions order by column"; 

Ahora, posiblemente, obtenga su key (en el Map ) para get valores múltiples. Puede hacer dos cosas, ya sea usar un bucle ResultSetExtractor sobre los resultados usted mismo o usar un RowCallbackHandler que hace la iteración por usted.

Lo que necesita hacer es simplemente repetir los resultados (o dejar que JdbcTemplate haga por usted) para su columna de key, verifique el Map si ya hay una List allí. Si es agregar una fila, si no es primero, crea la List y agrégala al Map resultados.

 public Map<String, List<MODEL>> fun(){ final Map<String, List<MODEL>> map = new TreeMap<String, List<MODEL>>(); String sql = "select * from table where conditions order by column"; getJdbcTemplate().query(sql, new RowCallbackHandler() { public void processRow(ResultSet resultSet) throws SQLException { String key = rs.getString("column"); List rows = map.get(key); if (rows == null) { rows = new new ArrayList<MODEL>(); map.put(key, rows); } MODEL obj = new MODEL(); // set values to setters from resultset rows.add(obj); }, "arguments"); return map; } 

Otra solución, que solo funcionaría si la 'columna' también es parte de la class MODEL . De esa forma, podría usar un RowMapper y get una List de todos los objects MODEL y luego hacer la partición. Podrías usar Google Guava para hacerlo un poco más fácil o si estás en Java 8 podrías usar la API nueva para eso.