如何在jooq查询中左连接时检查记录是否为空

问题描述

我尝试通过左连接在另一个表上从表中获取一条记录。找不到第二张表中的信息,但我希望第一张表中有信息。

    val citizenship = Tables.COUNTRIES.`as`("citizenship")
    try {
        return context.selectFrom(Tables.CLIENT_PROJECTIONS
                .leftJoin(citizenship).on(
                        Tables.CLIENT_PROJECTIONS.CITIZENSHIP_COUNTRY_CODE.eq(
                                citizenship.CODE_ALPHA2
                        )
                )
        ).where(Tables.CLIENT_PROJECTIONS.ID.eq(id)).fetchOne {
            val clientProjection = ClientProjectionMapper.map(it.into(Tables.CLIENT_PROJECTIONS)) ?: return@fetchOne null
            clientProjection.citizenship = CountryMapper.map(it.into(citizenship))
            clientProjection
        }
    } catch (ex: DataAccessException) {
        logger.error("Failed to access to database",ex)
        throw ex
    } 

我将数据从CountrysRecord转换为CountryMapper中的实体:

object CountryMapper : RecordMapper<CountriesRecord,Country> {
  override fun map(record: CountriesRecord?): Country? = when {
    record != null -> {
        Country(
                countryCode = record.codeAlpha,title = record.title
        )
    }
    else -> {
        null
    }
  }
}

但是,如果查询CountriesRecord的每个字段中返回null,则我的map方法将收到一个不可为空的实体,但该实体的每个字段均为空。

我可以检查CountriesRecord的每个字段是否为空,但是我认为这不是一个好主意。我可以通过其他更好的方法检查它吗?也许我应该向数据库编写更正确的查询

解决方法

SQL中的LEFT JOIN就是这样做的。对于连接的ON子句中没有匹配项的左连接表的所有列,它会产生空值。

您不必检查每一列是否为空。主键将足够好,因为它应该有一个NOT NULL约束,这意味着如果主键值为null(record.codeAlpha),那一定是因为{{1} }。

将第二个映射器更改为此:

LEFT JOIN