Как использовать BeanMapHandler с сопоставлением полей и столбцов с ключом в качестве идентификатора во вложенном запросе SELECT? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть вложенный запрос SQL для получения сведений о сотруднике с использованием их идентификатора.

Сейчас я использую BeanListHandler для получения данных как List<Details>, но хочу сохранить их как Map<String, Details>, где Идентификатор, который я первоначально передаю, должен быть ключом для легкого поиска, а не поиска в Списке с потоками каждый раз.

Я пытался преобразовать в Карты, но я не уверен, как сопоставить идентификатор как строку или как получить исходный идентификатор, переданный во внутренний запрос в виде столбца в конечном результате.

MainTest. java:

String candidateId = "('1111', '2222', '3333', '4444')";

String detailsQuery =
    "select PARTNER, BIRTHDT, XSEXM, XSEXF from \"schema\".\"platform.view/table2\" where partner IN \r\n"
            + "(select SID from \"schema\".\"platform.view/table1\" where TYPE='BB' and CLASS='yy' and ID IN \r\n"
            + "(select SID from \"schema\".\"platform.view/table1\" where TYPE='AA' and CLASS='zz' and ID IN"
            + candidateId + "\r\n" + "))";

Map<String, Details> detailsView = queryRunner.query(conn, detailsQuery, new DetailsViewHandler());

Подробности. java:

public class Details {

    private String candidateId;
    private String birthDate;
    private String maleSex;
    private String femaleSex;

    // getter and setter
}

DetailsViewHandler. java:

public class DetailsViewHandler extends BeanMapHandler<String, Details> {

    public DetailsViewHandler() {
        super(Details.class, new BasicRowProcessor(new BeanProcessor(getColumnsToFieldsMap())));
    }

    public static Map<String, String> getColumnsToFieldsMap() {
        Map<String, String> columnsToFieldsMap = new HashMap<>();
        columnsToFieldsMap.put("PARTNER", "candidateId");
        columnsToFieldsMap.put("BIRTHDT", "birthDate");
        columnsToFieldsMap.put("XSEXM", "maleSex");
        columnsToFieldsMap.put("XSEXF", "femaleSex");
        return columnsToFieldsMap;
    }
}

Есть ли способ получить ID (candidateId) в результате и что мне не хватает в плане создания пары ключ-значение?

1 Ответ

0 голосов
/ 08 мая 2020

Из do c https://commons.apache.org/proper/commons-dbutils/apidocs/org/apache/commons/dbutils/handlers/BeanMapHandler.html используемого вами конструктора

public BeanMapHandler(Class<V> type,
                      RowProcessor convert)

// Creates a new instance of BeanMapHandler. The value of the first column of each row will be a key in the Map.

Выше должно работать.

Вы также можете попробовать переопределить createKey вот так

protected K createKey(ResultSet rs)
               throws SQLException {
return rs.getString("PARTNER"); // or getInt whatever suits

}
...