JDBI 结果集映射与连接的结果列表?

问题描述 投票:0回答:3

尝试使用 JDBIs ResultSetMapper API 构建一个 Country 对象,但是我有一个问题不知道如何解决。

对于如下所示的结果集,将地区(州/地区)表连接到国家/地区 (1 - 0..n)

    @Override
public Country map(final int index, final ResultSet resultRow, final StatementContext ctx) throws SQLException {

    final String countryIso3Code = resultRow.getString("iso3Code");


    return Country.builder().name(resultRow.getString("name"))
            .iso2Code(resultRow.getString("iso2Code"))
            .iso3Code(resultRow.getString("iso3Code"))
            .regions(....?)
            .build();

}

如何让 ResultSetMapper 使用 JDBI 中相关区域的适当列表初始化一个 Country 对象

例如

美国 - (USA) - (US) - (PR, RI, WA)

目前返回的国家列表如下

英国 - GBR - GB - <>

美国-美国-美国-PR

美国-美国-美国-RI

美国 - 美国 - 美国 - WA

波多黎各 - PRI - PR - <>

加拿大 - CAN - CA - AB

加拿大 - CAN - CA - BC

java jdbc jdbi
3个回答
3
投票

您可以使用 StatementContext 参数。

当map方法看到一个新的国家时,它会创建一个新的Country实例并调用ctx.setAttribute来保存新实例。稍后,如果存在非空区域,则会将该区域添加到从语句上下文中获取的 Country 实例。

这是一个例子:

    @Override
    public Country map(final int index, final ResultSet resultRow, final StatementContext ctx) throws SQLException {

        final String countryIso3Code = resultRow.getString("iso3Code");
        if (countryIso3Code == null) {
            throw new SQLDataException("Iso3Code is required");
        }
        Country country = (Country)ctx.getAttribute(countryIso3Code);
        if (country == null) {
            country = new Country();
            country.setName(resultRow.getString("name"));
            country.setIso3Code(countryIso3Code);
            country.setIso2Code(resultRow.getString("iso2Code"));
            ctx.setAttribute(countryIso3Code, country);
        }

        String region = resultRow.getString("region");
        if (region != null) {
            country.addRegion(region);
        }
        return country;
    }

像在您发布的代码中那样使用构建器有点不方便,但可以将构建器放在语句上下文而不是国家/地区上。

此外,此映射器为每个数据库行返回一个国家/地区,因此有七个结果,但由于重复相同的实例,因此使用 Set 可以获得预期的四个结果。


0
投票

Jdbi 提供“减少行”功能来处理“连接结果”:https://jdbi.org/#_joins

您需要实现 RowReducer,并承担以下职责:

  • 在第一次遇到结果集行时根据结果集行构建国家(您可以使用简化的 RawMapper 实现)。检测可能基于国家/地区主键
  • 将构建国家/地区存储在容器中,由其主键映射,以便在以下结果集行中再次遇到时能够检索它
  • 从容器中检索国家,如果当前行是关于已经遇到的国家,则将当前行指定的区域添加到检索到的国家

Jdbi 使用行缩减器来解析每个结果集行,并提供容器的内容作为结果。

您可以按照jdbi文档中的示例进行操作:https://jdbi.org/#_resultbearing_reducerows


0
投票

确定您的资格:您可以通过多种计划申请永久居民。 1.快速入境 2.省提名计划(PNP) 3.家庭赞助 4.商业移民项目 收集所需文件:这通常包括身份证明文件、教育证书、语言测试结果(如**雅思**)、工作经验文件和资金证明。

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