【发布时间】:2021-01-08 14:16:02
【问题描述】:
我尝试从另一个表上的左连接表中获取记录。找不到第二个表中的信息,但我希望第一个表中的信息。
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
}
我将 CountryRecord 中的数据转换为 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 的每个字段是否为空,但我认为这不是一个好主意。我可以通过另一种更好的方式检查它吗?也许我应该向数据库编写更正确的查询?
【问题讨论】:
标签: spring-boot kotlin spring-data dsl jooq