poner datos sql en mapas de java y luego obtener valor de filas [cerrado]

Estoy poniendo los datos en mi mapa como

Map getDataFromQuery(String query){
        def firstRow = sql.firstRow(query)
        return firstRow

pero mi consulta sql me está dando más de una fila y necesito obtener valores para columnas específicas. y necesito asegurarme de que las referencias de fila permanezcan intactas.

ex: necesito el primer nombre, apellido, estado activo. para 50 personas.

No puedo cambiar la consulta sql, sólo cómo se almacenan los datos y qué valores puedo tomar de ella.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por devdoodle


3 Respuestas:

  • Suponiendo, que sql aquí es un caso groovy.sql.Sql, tu uso de firstRow restringe el resultado a una sola fila. Uso rowsen lugar de buscar todas las filas.

    Sin embargo, es generalmente más eficiente preguntar a la base de datos lo que usted en realidad necesita en lugar de buscar "todo" y cosas de hierba en la aplicación. Quizás podrías usar la consulta original como una Sub-query.

    Respondida el Dec 17, 2020 a las 15:20 - por codecraftsman

    Votos positivos: 0 | Votos negativos: 0

  • Para manejar múltiples filas de datos de SQL y obtener valores específicos de columnas para cada fila, puedes modificar tu método getDataFromQuery para que devuelva una lista de mapas en lugar de solo un mapa. Cada mapa en la lista representaría una fila de datos, y podrías acceder a los valores de columnas específicas de esa fila de la siguiente manera:

    Por ejemplo, podrías modificar tu método de la siguiente manera:

    java
    List> getDataFromQuery(String query){
        def rows = sql.rows(query)
        List> data = new ArrayList<>();
    
        rows.each { row ->
            Map rowData = [:]
            rowData.put("primerNombre", row.primerNombre)
            rowData.put("apellido", row.apellido)
            rowData.put("estadoActivo", row.estadoActivo)
            data.add(rowData)
        }
    
        return data;
    }
    

    De esta manera, tu método devolverá una lista de mapas, donde cada mapa contendrá los valores de "primerNombre", "apellido" y "estadoActivo" para cada fila de la consulta SQL.

    Luego, cuando necesites acceder a los valores para una fila específica, puedes hacer lo siguiente:

    java
    List> result = getDataFromQuery("SELECT * FROM tabla");
    
    result.each { row ->
        String primerNombre = row.get("primerNombre");
        String apellido = row.get("apellido");
        String estadoActivo = row.get("estadoActivo");
    
        // Haz lo que necesites con los valores de la fila actual
        System.out.println("Nombre: " + primerNombre + ", Apellido: " + apellido + ", Estado Activo: " + estadoActivo);
    }
    

    Recuerda ajustar los nombres de las columnas a la estructura de tu consulta SQL real.

    Respondida el Dec 18, 2020 a las 15:19 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener los valores de columnas específicas de múltiples filas devueltas por una consulta SQL y mantener intactas las referencias de fila, puedes utilizar las siguientes técnicas:

    Utilizar sql.rows() en lugar de sql.firstRow():

    sql.rows() devuelve un ResultSet que contiene todas las filas devueltas por la consulta. Puedes iterar sobre el ResultSet para acceder a los valores de todas las filas.

    java
    Map> getDataFromQuery(String query) {
        Map> data = new HashMap<>();
        ResultSet resultSet = sql.rows(query);
        int rowNum = 1;
        while (resultSet.next()) {
            Map rowData = new HashMap<>();
            rowData.put("first_name", resultSet.getString("first_name"));
            rowData.put("last_name", resultSet.getString("last_name"));
            rowData.put("active_status", resultSet.getBoolean("active_status"));
            data.put(rowNum++, rowData);
        }
        return data;
    }
    

    Utilizar los métodos get() del ResultSet:

    Los métodos get() del ResultSet te permiten obtener el valor de una columna específica por su nombre o índice. Puedes utilizar estos métodos para acceder a los valores de las columnas que te interesan.

    java
    Map> getDataFromQuery(String query) {
        Map> data = new HashMap<>();
        ResultSet resultSet = sql.rows(query);
        int rowNum = 1;
        while (resultSet.next()) {
            Map rowData = new HashMap<>();
            rowData.put("first_name", resultSet.getString("first_name"));
            rowData.put("last_name", resultSet.getString("last_name"));
            rowData.put("active_status", resultSet.getBoolean("active_status"));
            data.put(rowNum++, rowData);
        }
        return data;
    }
    

    Utilizar un RowMapper:

    Un RowMapper es una interfaz de Groovy que te permite personalizar cómo se mapean las filas devueltas por una consulta SQL en objetos. Puedes crear un RowMapper para mapear las filas en instancias de una clase personalizada que contenga los valores de las columnas que te interesan.

    java
    class PersonRowMapper implements RowMapper {
        @Override
        Person mapRow(ResultSet resultSet) {
            return new Person(
                resultSet.getString("first_name"),
                resultSet.getString("last_name"),
                resultSet.getBoolean("active_status")
            );
        }
    }
    
    Map getDataFromQuery(String query) {
        Map data = new HashMap<>();
        ResultSet resultSet = sql.rows(query);
        int rowNum = 1;
        while (resultSet.next()) {
            data.put(rowNum++, new PersonRowMapper().mapRow(resultSet));
        }
        return data;
    }
    

    Advertencia: Recuerda cerrar el ResultSet cuando hayas terminado de usarlo para liberar recursos.

    Respondida el Dec 18, 2020 a las 15:27 - por Gemini

    Votos positivos: 0 | Votos negativos: 0