我希望能够在JOOQ中从这个
有几种解决方法:
在相对简单的情况下,当可选连接跟随一个对一关系时,您可以使用隐式连接(如果您正在使用代码生成器):
create.select()
.from(TABLE_A)
.join(TABLE_B).onKey(Keys.FK_TABLEA_TABLEB)
.where(isFooSearched
? TABLE_B.tableC().FIELDC.containsIgnoreCase("foo")
: noCondition())
.fetch();
create.select()
.from(TABLE_A)
.where(
isFooSearched
? TABLE_A.TABLE_B_ID.in(
select(TABLE_B.ID)
.from(TABLE_B)
.join(TABLE_C).onKey(FK_TABLEB_TABLEC)
.where(TABLE_C.FIELDC.containsIgnoreCase("foo"))
)
: trueCondition())
.fetch();
TABLE_A
(使用DISTINCT
删除它们可能是错误的,并且肯定效率低下)。EXISTS
或IN
语法中的半连接,因此与基于JOIN
的解决方案相比,可能无法最优地运行此语句。// I'm assuming DISTINCT is required here, as you
// - are not interested in TABLE_B and TABLE_C results (semi join semantics)
// - do not want any duplicate TABLE_A values
create.selectDistinct(TABLE_A.fields())
.from(
isFooSearched
? TABLE_A
.join(TABLE_B).onKey(FK_TABLEA_TABLEB)
.join(TABLE_C).onKey(FK_TABLEB_TABLEC)
)
: TABLE_A)
.where(
isFooSearched
? TABLE_C.FIELDC.containsIgnoreCase("foo")
: trueCondition())
.fetch();
我在这里做了一些假设,包括您的联接查询中使用DISTINCT
可能是正确的,但它可能会对您的“默认”查询变体造成影响,因此,将其硬塞到单个动态查询中可能过于复杂。
因此...
对我来说,这两个查询足够简单,可以允许一些重复,并根据标志运行两个不同的查询:
if (isFooSearched)
create.select().from(TABLE_A) /* joins or semi joins here */ .fetch();
else
create.select().from(TABLE_A).fetch();
所有解决方案都假定您在代码中使用了这些静态导入:
import static org.jooq.impl.DSL.*;
mycheck
为true
/false
时,所需的SQL查询是什么?问题描述得越完整,答案就会越好... - Lukas Ederif
语句中使用select.where
和select.join
吗? - Antoniossss