如何在JOOQ中编写OPTIONAL where子句

Luk*_* Xu 7 jooq java-8

List<MyTable> result = DSL.using(configuration())
                .select()
                .from(MY_TABLE)
                .where(MY_TABLE.ID1.equal(pk_id1))
                        .and(MY_TABLE.ID2.equal(fk_id2))
                        .and(MY_TABLE.ID3.equal(fk_id3))
                .orderBy(MY_TABLE.ID.asc())
                .limit(limit)
                .fetchInto(MY_TABLE)
                .map(mapper());
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一些代码,允许我的查询采用三个可选的id,例如我希望查询最终成为

select * from my_table where ID1=5 and ID2=6 and ID3=7 .... etc 
Run Code Online (Sandbox Code Playgroud)

但是,我还想选择能够排除任何id

select * from my_table where ID2=6 and ID3=7 
Run Code Online (Sandbox Code Playgroud)

要么

select * from my_table where ID3=7
Run Code Online (Sandbox Code Playgroud)

这个问题是第一个"where"子句属于id 1,其余的是ands所以如果我做了一个if语句并且我删除了那里然后我会留下

List<MyTable> result = DSL.using(configuration())
                .select()
                .from(MY_TABLE)
                        .and(MY_TABLE.ID2.equal(fk_id2))
                        .and(MY_TABLE.ID3.equal(fk_id3))
                .orderBy(MY_TABLE.ID.asc())
                .limit(limit)
                .fetchInto(MY_TABLE)
                .map(mapper());
Run Code Online (Sandbox Code Playgroud)

它不会起作用.

我试图寻找类似于where id = **are essentianlly没有过滤器的东西,但我找不到那样的东西.

Luk*_*der 15

jOOQ使编写SQL感觉好像它是静态的嵌入式SQL.但事实并非如此.每个jOOQ查询都是一个由表达式树组成的动态SQL查询 - 您只是没有注意到它.

SelectWhereStep.where(Condition)方法接受一个Condition参数,您不必使用该WHERE子句放在那里.您可以在查询之前构造它:

Condition condition = DSL.trueCondition();
if (something)
    condition = condition.and(MY_TABLE.ID1.equal(pk_id1));
if (somethingElse)
    condition = condition.and(MY_TABLE.ID2.equal(fk_id2));
if (somethingOther)
    condition = condition.and(MY_TABLE.ID3.equal(fk_id3));
Run Code Online (Sandbox Code Playgroud)

您现在可以将其传递给您的查询:

List<MyTable> result = 
DSL.using(configuration())
   .select()
   .from(MY_TABLE)
   .where(condition)
   .orderBy(MY_TABLE.ID.asc())
   .limit(limit)
   .fetchInto(MY_TABLE)
   .map(mapper());
Run Code Online (Sandbox Code Playgroud)

还有一些实用方法DSL,例如:

这也在手册中记录:http://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql/

  • @LukeXu:是的,这是trueCondition的目的... :)你确定你将每个新条件分配给变量吗?and()操作创建一个新条件.它不会修改左侧 (2认同)