我写了代码,应该从数据库表中按记录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行)。照片<-
列表.copyOf 和 Arrays.asList 没有帮助(因为它不是默认数组)。
尝试将结果数组转换为一个列表,像这样 List<Student> students = (List<Student>) rs.getArray("students");
我自己做了一个简单的实用方法,用于 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
类的样子?