2012-12-27 24 views
9

Devo creare una query JOOQ SELECT in modo dinamico in base all'insieme di parametri. Non so come aggiungerlo dinamicamente. Si prega di aiutareCreazione dinamica della query JOOQ

Grazie in anticipo.

+2

Puoi essere un po 'più esplicito? Per esempio. potresti fornire una query di esempio che vorresti costruire? Che cosa hai provato, dove hai fallito? –

+0

In realtà ho bisogno di creare la query di selezione; in cui ho bisogno di aggiornare la clausola where in base ai parametri passati. Come dall'interfaccia utente sto passando alcuni filtri e voglio aggiungere dinamicamente alla mia condizione WHERE. – user1900723

risposta

25

jOOQ ha due tipi di API per costruire query.

  • L'API DSL che consente di creare istruzioni SQL inline nel codice Java, ad es.

    create.select(T.A, T.B).from(T).where(T.X.eq(3).and(T.Y.eq(5))); 
    
  • L'API "modello" che consente la creazione incrementale di SQL. In qualsiasi momento, è possibile accedere alla API "modello" attraverso il metodo getQuery() su un oggetto query DSL

Un esempio di ciò che si vuole fare è data nel manuale qui:

https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/dsl-and-non-dsl/

Per esempio, opzionalmente l'aggiunta di registrazione:

DSLContext create = DSL.using(configuration); 
SelectQuery query = create.selectQuery(); 
query.addFrom(AUTHOR); 

// Join books only under certain circumstances 
if (join) 
    query.addJoin(BOOK, BOOK.AUTHOR_ID.equal(AUTHOR.ID)); 

Result<?> result = query.fetch(); 

Oppure, optinally aggiungendo condizioni/predicati:

012.
query.addConditions(BOOK.TITLE.like("%Java%")); 
query.addConditions(BOOK.LANGUAGE_CD.eq("en")); 

UPDATE: Dato i tuoi commenti, questo è quello che stai cercando:

// Retrieve search strings from your user input (just an example) 
String titleSearchString = userInput.get("TITLE"); 
String languageSearchString = userInput.get("LANGUAGE"); 
boolean lookingForTitles = titleSearchString != null; 
boolean lookingForLanguages = languageSearchString != null; 

// Add only those conditions that the user actually provided: 
if (lookingForTitles) 
    query.addConditions(BOOK.TITLE.like("%" + titleSearchString + "%")); 
else if (lookingForLanguages) 
    query.addConditions(BOOK.LANGUAGE_CD.eq(languageSearchString)); 

nota, è anche possibile utilizzare i Field.compare(Comparator, Object) metodi:

// Initialise your dynamic arguments 
Field<String> field = BOOK.TITLE; 
Comparator comparator = Comparator.LIKE; 
String value = "%" + titleSearchString + "%"; 

// Pass them to the field.compare() method 
query.addConditions(field.compare(comparator, value)); 

Per ulteriori informazioni, considera il org.jooq.SelectQuery Javadoc

+0

Ma ho ancora una domanda. Posso usare le variabili java nella query (in particolare nella parte addConditions), così posso mettere il valore di quelle variabili in fase di esecuzione. per es. nome della colonna. – user1900723

+0

@ user1900723: cosa ti impedisce di assegnare quegli elementi alle variabili in Java? –

+0

Lascia che ti spieghi lo scenario. In realtà ho alcune colonne che devo cercare nella tabella. Ad esempio: nome, ID, data. e ho bisogno di recuperare i dati in base a loro, avendo un altro parametro che contiene i valori come UGUALE A, INIZIA CON (è necessario utilizzare come operatore), TERMINA CON (è necessario utilizzare come operatore). Ho bisogno di fare tutto questo dinamicamente. Quindi, ho bisogno di usare la variabile in modo da poter mettere il valore al volo. Per favore fatemi sapere se avete bisogno di ulteriori chiarimenti. Sono bloccato qui. – user1900723