繁体   English   中英

JOOQ - 有条件加入或不退出

[英]JOOQ - Join on condition or not exit

我有以下查询:

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))

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

关于已弃用的 API

但这是说 [...] 中的“和”已被弃用

看到该方法的弃用通知了吗? 它说:

已弃用。 - 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 )Z9。 SQL 实现了三值逻辑

将您的谓词替换为:

and(BUSINESS_ADDRESS.DEACTIVATERD_AT.isNull())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM