簡體   English   中英

如何以自定義方式處理多行結果?

[英]How to process multi-row result in a custom way?

現在我的方法體看起來像這樣:

jdbcTemplate.query(queryJoiningTwoTables, (rs, rowNum) -> {
    final long id= rs.getLong("id");
    MyObject obj = jobStatusBunchMap.get(id);
    if (obj== null) {
        OffsetDateTime offsetDateTime = rs.getObject("creation_timestamp", OffsetDateTime.class);
        ...
        obj = new MyObject (offsetDateTime ...);
        map.put(id, obj );
    }
    String jobId = rs.getString("job_id");
    obj.getJobIds().add(jobId);
    return null;
});
return map.values();

看起來我以不正確的方式使用 API。

有沒有更好的方法來實現相同的目標?

聚苯乙烯

我試圖使用jdbcTemplate#queryForRowSet但在這種情況下rs.getObject("creation_timestamp", OffsetDateTime.class)拋出異常,它不支持操作。

有很多選項可以使用 jdbcTemplate 映射結果,包括您的。 也許這會幫助你更好地理解它:

public List<Action> findAllActions() {
    final String selectStatement = "SELECT id,name FROM Actions"; // or your query
    try {

        return jdbcTemplate.query(selectStatement,(resultSet, rowNum) -> {

            int actionId = resultSet.getInt("id");
            String actionName = resultSet.getString("name");

            Action action = new Action();
            action.setId(actionId);
            action.setName(actionName);

            return action;
        });

    } catch (EmptyResultDataAccessException e) {
        LOGGER.error("Get all actions - empty set", e);
        return Collections.emptyList();
    }
}

如果沒有 lambda 表達式,您可以像這樣使用 jdbcTemplate 查詢:

public List<Action> findAllActions() {
    final String selectStatement = "SELECT id,name FROM Actions"; // or your query
    try {

        return jdbcTemplate.query(selectStatement, getActionRowMapper());

    } catch (EmptyResultDataAccessException e) {
        LOGGER.error("Get all actions - empty set", e);
        return Collections.emptyList();
    }
}
private RowMapper<Action> getActionRowMapper() {
    return (resultSet, rowNum) -> {

        int actionId = resultSet.getInt("id");
        String actionName = resultSet.getString("name");

        return action;
    };
}

如您所見, jdbcTemplate.query 方法的第二個參數采用RowMapper<Action>類型,但使用 lambdas 表達式隱藏。 除了為每一行映射 resultSet 並返回結果之外,此選項“限制”您進行任何其他操作。 最終的結果最終將是一個動作List

第二個選項是使用ResultSetExtractor ,它可以讓您遍歷結果集並為您提供更大的靈活性。 查詢將是相同的,只是 jdbcTemplate.query 方法的第二個參數將被更改。 為此,我會親自實現ResultSetExtractor並覆蓋extractData方法,或者如果您不需要其他任何東西來映射結果,您可以執行與上述相同的操作

public List<Group> findGroups() {
    final String selectStatement = "SELECT stud.id, stud.name, gr.id, gr.name FROM student stud INNER JOIN group gr ON gr.id=stud.group_id ORDER BY stud.id"; // or your query
    try {

        return jdbcTemplate.query(selectStatement, new GroupExtractor() );

    } catch (EmptyResultDataAccessException e) {
        LOGGER.error("Get all groups - empty set", e);
        return Collections.emptyList();
    }
}


public class GroupExtractor implements ResultSetExtractor<List<Group>> {
@Override
public List<Group> extractData(ResultSet resultSet) {
    Map<Group, List<Student>> studentsGroup= new HashMap<>();
    List<Group> groups = new ArrayList<>();
    try {
        while (resultSet.next()) {
          int studentId = resultSet.getInt("stud.id");
            String studentName = resultSet.getString("stud.name");
            int groupId = resultSet.getInt("gr.id");
            String groupName = resultSet.getString("gr.name");

            Group group = createGroup(groupId, groupName);
            Student student = createStudent(studentId, studentName);

            studentsGroup.putIfAbsent(group, new ArrayList<>());
            studentsGroup.get(group).add(student);

        }

        studentsGroup.forEach((group,students) ->{
            group.setStudents(students);
            groups.add(group);
        }

        return groups;

    } catch (SQLException e) {
        LOGGER.info("An error occured during extracting data", e);
    }
    return actions;
 }

private Student createStudent(String studentId, String studentName)
{
  Student student=new Student();
  student.setId(studentId);
  student.setName(studentName);
  return student;
}

//idem for createGroup
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM