2016-05-15 44 views
5
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()); 

我尝试写一些代码,让我的查询采取三种可选的id例如我想查询最终是如何写可选其中JOOQ条款

select * from my_table where ID1=5 and ID2=6 and ID3=7 .... etc 

然而,我也想了能够排除任何的ID的

select * from my_table where ID2=6 and ID3=7 

select * from my_table where ID3=7 
选项

的问题,这是第一个“where”子句属于ID之一,其余的都是阿富汗国家发展战略,所以如果我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()); 

它不会工作。

我试图寻找类似where id = *的地方,其中*基本上没有过滤器,但我找不到像这样的东西。

回答

5

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

您现在可以传递到您的查询:您可以查询之前建立它

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

也有DSL实用方法,如:

这也是这里记录的手册中构建AND连接条件:http://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql/

+0

我想它,但出于某种原因trueCondition总是评估为真,所以我的查询只返回一切。是否有另一个条件使用? –

+1

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

+0

啊好吧,这是有道理的,谢谢! –

2

你所要求的有时被称为“SQL”数字“通配符”,或者至少你可以在网上找到评论,如果你搜索的话。

SQL不允许你写“其中id = *”代替,如果你需要你的DDL保持静态,你可以通过做一系列检查像

select * from table 
    where 
    (my_table.id1 >= fk_id1_low and my_table.id1 <= fk_id1_high) and 
    (my_table.id2 >= fk_id2_low and my_table.id2 <= fk_id2_high) and 
    (my_table.id3 >= fk_id3_low and my_table.id3 <= fk_id3_high) 

因此效仿,现在你逝去的共如果你想对id1进行匹配,你将把fk_id1_low和fk_id1_high设置为你想要匹配的值。如果您不想与id1匹配,您将设置fk_id1_low为最小可能值,并将fk_id1_high设置为最大可能值。你必须考虑的一件事情是数据库引擎如何处理生成的查询,因为可能会执行大量额外的工作。

使用JOOQ另一个可能的答案是从流畅的界面移开,以便您可以使用if..then条件部分构建查询。