【问题标题】:jOOQ returns wrong column value from recordjOOQ 从记录中返回错误的列值
【发布时间】:2021-03-09 02:06:26
【问题描述】:

我有以下记录,是由带有几个连接的查询产生的:

现在,当我尝试检索不在结果中的特定列时:

record[REG_MEDEWERKER.ID]

REG_MEDEWERKER.ID 生成的 Kotlin 代码具有以下详细信息:

我希望得到null。但是,会返回错误的 id 值(zkn_zaak.id)。

我在这里缺少什么? jOOQ 不应该有足够的信息(表和字段名)来从记录中检索正确的列吗?

============更新=============

从代码看来,这是预期的行为,并且已经在例如 https://github.com/jOOQ/jOOQ/issues/4471, https://github.com/jOOQ/jOOQ/issues/4455, https://github.com/jOOQ/jOOQ/issues/4476https://github.com/jOOQ/jOOQ/issues/10266

所以这解释了很多。

但是,问题仍然是如何确定 REG_MEDEWERKER.ID 列不在结果集中...

【问题讨论】:

    标签: kotlin jooq


    【解决方案1】:

    实现了以下 Kotlin 扩展方法,仅当字段的限定名称与记录中字段的限定名称匹配时才返回记录的值(参见 Lukas Eder 的回答):

    fun <T> Record.getStrict(field: Field<T>): T? =
        this.field(field)?.qualifiedName
            ?.takeIf { field.qualifiedName == it }
            ?.let { this[field] }
    

    【讨论】:

      【解决方案2】:

      来自Record.get(Field)Javadoc:

      如果此记录包含与参数字段具有相同 Field.getName() 的字段,则检索该值。

      所以根据不合格的列名检索值。只有当该列名不明确时,才会考虑限定以尝试消除列名的歧义。

      虽然这可能会导致您遇到意想不到的结果,但在使用别名表、派生表等时它有很多优势。

      【讨论】:

      • 感谢您的反应。是否有另一种方法可以查看该列是否在结果中? Record.getStrict(Field) 之类的东西?
      • @Jippe: Record.field(Field) 将在记录中生成 actual 字段。然后您可以检查限定名称是否相同。
      • 不过,从日志中的所有SQLWarning 来看,我觉得这不是最佳实践。在选择中使用别名来消除字段歧义会更好吗?
      • @Jippe:我不能从你当前的问题中说,你还没有发布查询......
      • 你可以在这个gist找到查询
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2020-06-04
      • 2019-05-11
      • 2013-12-04
      相关资源
      最近更新 更多