[英]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))
已弃用,有什么替代方法?
但这是说 [...] 中的“和”已被弃用
看到该方法的弃用通知了吗? 它说:
已弃用。 - 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
(不是TRUE
或FALSE
)Z9。 SQL 实现了三值逻辑。
将您的谓词替换为:
and(BUSINESS_ADDRESS.DEACTIVATERD_AT.isNull())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.