【问题标题】:JOOQ - Join on condition or not exitJOOQ - 有条件加入或不退出
【发布时间】:2021-07-13 04:18:50
【问题描述】:

我有以下疑问:

Map<BusinessRecord, List<BusinessAddressRecord>> resultMap = dslContext
        .select()
        .from(BUSINESS.leftJoin(BUSINESS_ADDRESS).on(BUSINESS.ID.eq(BUSINESS_ADDRESS.BUSINESS_ID)))
        .where(BUSINESS.IDENTIFIER.equal(identifier))
        .and(BUSINESS_ADDRESS.DEACTIVATED_AT.isNull())
        .fetchGroups(
                b -> b.into(BUSINESS),
                a -> a.into(BUSINESS_ADDRESS)
        );

不幸的是,如果公司没有列出地址,这将返回 null,我设法解决了这个问题:

  Map<BusinessRecord, List<BusinessAddressRecord>> resultMap = dslContext
          .select()
          .from(BUSINESS.leftJoin(BUSINESS_ADDRESS).on(
                  BUSINESS.ID.eq(BUSINESS_ADDRESS.BUSINESS_ID).and(BUSINESS_ADDRESS.DEACTIVATED_AT.equals(null))
          ))
          .where(BUSINESS.IDENTIFIER.equal(identifier))
          .fetchGroups(
                  b -> b.into(BUSINESS),
                  a -> a.into(BUSINESS_ADDRESS)
          );

但这是在说“和”

and(BUSINESS_ADDRESS.DEACTIVATED_AT.equals(null))

已弃用,有什么替代方案?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    关于已弃用的 API

    但这是说 [...] 中的 'and' 已弃用

    看到deprecation notice on that method了吗?它说:

    已弃用。 - 3.8.0 - [#4763] - 使用 and(Condition)(通常使用 DSL.trueCondition()DSL.falseCondition()DSL.noCondition() 作为参数)或 and(Field)。由于使用 Field.equals(Object) 参数调用此方法与通过 Field.equal(Object) 参数调用另一个方法之间存在歧义,因此将来会删除此方法。

    您使用的是 Object.equals(),而不是 jOOQ 的 Field.equal()(或 Field.eq())。有一个and(Boolean) 重载,它已经造成了你多次遇到的那种麻烦,这就是它被弃用的原因,并将在 jOOQ 3.15.0 中与#11242 一起删除。之后,您使用 equals() 而不是 equal() 的代码将不再编译。

    空值

    在 SQL 中(因此在 jOOQ 中),您不能使用普通的比较运算符将值与 NULL 进行比较,因为这种比较的结果始终是 NULL(而不是 TRUEFALSE)。 SQL 实现three valued logic

    将谓词替换为:

    and(BUSINESS_ADDRESS.DEACTIVATERD_AT.isNull())
    

    【讨论】:

      猜你喜欢
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 2016-06-17
      • 2014-10-15
      • 2019-03-01
      • 1970-01-01
      • 2012-06-30
      相关资源
      最近更新 更多