2016-05-15 9 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()); 

Ich versuche, einige Code zu schreiben, meine Abfrage drei optionale ids ermöglicht zum Beispiel nehme ich die Abfrage schließlich möchteWie OPTIONAL zu schreiben, wo Klauseln in jOOQ

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

jedoch zu sein , ich möchte auch die Möglichkeit der Lage zu sein

select * from my_table where ID2=6 and ID3=7 
auszuschließen ist eine der ID

oder

select * from my_table where ID3=7 

Das Problem dabei ist, dass die erste „where“ Klausel gehört id ein und der Rest sind ands so, wenn ich eine if-Anweisung tat und ich entfernte das, wo dann würde ich nur mit

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

gelassen werden und es würde nicht funktionieren.

Ich habe versucht, nach etwas wie where id = * zu suchen, wo * essentialiell kein Filter ist, aber ich konnte nichts dergleichen finden.

Antwort

5

jOOQ macht das Schreiben von SQL als statisches Embedded SQL. Aber es ist nicht. Jede jOOQ-Abfrage ist eine dynamische SQL-Abfrage, die aus einem Ausdrucksbaum besteht - Sie merken es einfach nicht.

Die SelectWhereStep.where(Condition) Methode nimmt ein Condition Argument, das Sie nicht gleich mit der WHERE Klausel setzen müssen.Sie können es vor der Abfrage erstellen:

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

Sie können nun, dass auf Ihre Anfrage übergeben:

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

Es gibt auch Hilfsmethoden in DSL, wie zum Beispiel:

Dies auch hier im Handbuch dokumentiert ist: http://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql/

+0

Ich versuche es, aber aus irgendeinem Grunde Wahr-Bedingung wird immer als wahr ausgewertet, so dass meine Abfrage nur alles zurückgibt. Gibt es eine andere Bedingung zu verwenden? –

+1

@LukeXu: Ja, das ist der Zweck der trueCondition ... :) Sind Sie sicher, dass Sie jeder neuen Bedingung die Variable zurück zuweisen? Die Operation and() erzeugt eine neue Bedingung. Es ändert nicht die linke Seite –

+0

Ah okay, das macht Sinn, danke! –

2

Was Sie fragen, wird manchmal als "SQL-Nummer 'Wildcarding" bezeichnet oder zumindest können Sie Kommentare im Internet finden, wenn Sie danach suchen.

SQL ermöglicht es Ihnen nicht schreiben „wo id = *“ statt, wenn Sie Ihre DDL müssen statisch bleiben Sie es, indem Sie eine Bereichsprüfung wie

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) 

jetzt So emulieren können Sie insgesamt sind vorbei Wenn Sie eine Übereinstimmung mit ID1 vornehmen möchten, setzen Sie sowohl fk_id1_low als auch fk_id1_high auf den Wert, den Sie abgleichen möchten. Wenn Sie nicht mit id1 übereinstimmen möchten, setzen Sie fk_id1_low auf den minimal möglichen Wert und fk_id1_high auf den maximal möglichen Wert. Eine Sache, die Sie dabei berücksichtigen müssen, ist, wie die resultierende Abfrage von der Datenbank-Engine verarbeitet wird, da möglicherweise große Mengen zusätzlicher Arbeit ausgeführt werden.

Mit JOOQ ist eine andere mögliche Antwort weg von der fließenden Schnittstelle, so dass Sie die Abfrage mit if..hen dann bedingten Teilen erstellen können.