如何在 jooq 查询的左侧连接中检查记录是否完全为空
How to check record is fully empty on left join in jooq query
我尝试从 table 获取一条记录,并在另一个 table 上进行左连接。找不到第二个 table 中的信息,但我希望找到第一个 table 中的信息。
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
}
我在 CountryMapper
中将数据从 CountriesRecord 转换为实体:
object CountryMapper : RecordMapper<CountriesRecord, Country> {
override fun map(record: CountriesRecord?): Country? = when {
record != null -> {
Country(
countryCode = record.codeAlpha,
title = record.title
)
}
else -> {
null
}
}
}
但是如果在 CountriesRecord
的每个字段中查询 returns null 我的 map
方法接收到一个不可为 null 的实体,但该实体的每个字段都是空的。
我可以检查 CountriesRecord
的每个字段是否为空,但我认为这不是个好主意。我可以用另一种更好的方法检查它吗?也许我应该向数据库编写更正确的查询?
SQL 中的 LEFT JOIN
正是这样做的。它为在联接的 ON
子句中没有匹配项的左联接 table 的所有列生成空值。
您不必检查每列是否为空。主键就足够了,因为它应该有一个 NOT NULL
约束,这意味着如果主键值为 null (record.codeAlpha
),那一定是因为 LEFT JOIN
.
将您的第二个映射器更改为:
object CountryMapper : RecordMapper<CountriesRecord, Country> {
override fun map(record: CountriesRecord?): Country? = when {
record?.codeAlpha != null -> {
Country(
countryCode = record.codeAlpha,
title = record.title
)
}
else -> {
null
}
}
}
我尝试从 table 获取一条记录,并在另一个 table 上进行左连接。找不到第二个 table 中的信息,但我希望找到第一个 table 中的信息。
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
}
我在 CountryMapper
中将数据从 CountriesRecord 转换为实体:
object CountryMapper : RecordMapper<CountriesRecord, Country> {
override fun map(record: CountriesRecord?): Country? = when {
record != null -> {
Country(
countryCode = record.codeAlpha,
title = record.title
)
}
else -> {
null
}
}
}
但是如果在 CountriesRecord
的每个字段中查询 returns null 我的 map
方法接收到一个不可为 null 的实体,但该实体的每个字段都是空的。
我可以检查 CountriesRecord
的每个字段是否为空,但我认为这不是个好主意。我可以用另一种更好的方法检查它吗?也许我应该向数据库编写更正确的查询?
SQL 中的 LEFT JOIN
正是这样做的。它为在联接的 ON
子句中没有匹配项的左联接 table 的所有列生成空值。
您不必检查每列是否为空。主键就足够了,因为它应该有一个 NOT NULL
约束,这意味着如果主键值为 null (record.codeAlpha
),那一定是因为 LEFT JOIN
.
将您的第二个映射器更改为:
object CountryMapper : RecordMapper<CountriesRecord, Country> {
override fun map(record: CountriesRecord?): Country? = when {
record?.codeAlpha != null -> {
Country(
countryCode = record.codeAlpha,
title = record.title
)
}
else -> {
null
}
}
}