如何在jooq查询的左连接中检查记录是不是完​​全为空

Posted

技术标签:

【中文标题】如何在jooq查询的左连接中检查记录是不是完​​全为空【英文标题】:How to check record is fully empty on left join in jooq query如何在jooq查询的左连接中检查记录是否完​​全为空 【发布时间】: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 的每个字段是否为空,但我认为这不是一个好主意。我可以通过另一种更好的方式检查它吗?也许我应该向数据库编写更正确的查询?

【问题讨论】:

【参考方案1】:

SQL 中的LEFT JOIN 正是这样做的。它为连接的ON 子句中没有匹配的左连接表的所有列生成空值。

您不必检查每列是否为空。主键就足够了,因为它应该有一个NOT 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
    
  

【讨论】:

以上是关于如何在jooq查询的左连接中检查记录是不是完​​全为空的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ 是不是使用不同的连接来执行不同的查询?

限制在 MySQL 问题的左连接中返回的行

记录真实的 JDBC 连接并生成 Jooq 模拟文件

SQL Db2 中的左连接而不是不存在

如何查看 jOOQ 在编译时执行的 SQL 语句?

使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询