如何将数组(ResultSet JDBC)转换为List?

问题描述 投票:1回答:2

我写了代码,应该从数据库表中按记录ID取一个记录。表(记录)的其中一列是学生对象的集合。我如何从记录中提取学生并将其 "折叠 "为List集合?

代码。

public Group findObjById(final int id) {
        Group group = new Group();

        try {
            Statement st = connection.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM `course_work`.`group` WHERE `group_id` = " + id + ";");

            while (rs.next()) {
                int innerId = rs.getInt("group_id");
                List<Student> students = rs.getArray("students");
                group = new Group(innerId, students);
            }

            rs.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return group;
    }

第10行有错误(*.java中的第102行)。照片<-

列表.copyOfArrays.asList 没有帮助(因为它不是默认数组)。

java mysql jdbc collections
2个回答
0
投票

尝试将结果数组转换为一个列表,像这样 List<Student> students = (List<Student>) rs.getArray("students");


0
投票

我自己做了一个简单的实用方法,用于 java.sql.Array 类型。

    /**
     * Collects an SQL-Array using the given collector
     * @param array
     * @param valueRetriever
     * @param collector
     * @param <T>
     * @param <A>
     * @param <R>
     * @return
     * @throws SQLException
     */
    public static <T, A, R> R readArray(Array array, ResultSetValueRetriever<T> valueRetriever, Collector<T, A, R> collector) throws SQLException {
        final BiConsumer<A, T> accumulator = collector.accumulator();
        final A container = collector.supplier().get();

        if (array != null) {
            try (ResultSet rs = array.getResultSet()) {
                while (rs.next()) {
                    accumulator.accept(container, valueRetriever.get(rs, 2));
                }
            }
        }

        return collector.finisher().apply(container);
    }

    /**
     * Functional interface representing one ResultSet-Method to get the value of a column<p>
     * For example:<p>
     * <pre>
     *     ResultSetValueRetriever<String> getString = ResultSet::getString;
     *     ResultSetValueRetriever<Integer> getInt = ResultSet::getInt;
     * </pre>
     * @param <T> return type
     */
    @FunctionalInterface
    public interface ResultSetValueRetriever<T> {

        T get(ResultSet rs, int index) throws SQLException;
    }

使用。

final List<Integer> ints = readArray(rs.getArray(1), ResultSet::getInt, Collectors.toList());

现在它取决于列内的数据 students. 它是一个字符串数组吗?那你的 Student 类的样子?

© www.soinside.com 2019 - 2024. All rights reserved.