2012-12-27 18 views
9

Potrzebuję dynamicznie utworzyć zapytanie JOOQ SELECT w oparciu o zestaw parametrów. Nie wiem, jak dołączyć ją dynamicznie. Proszę o pomocDynamiczne tworzenie zapytania JOOQ

Z góry dziękuję.

+2

Czy możesz być nieco bardziej jednoznaczny? Na przykład. czy możesz podać przykładowe zapytanie, które chciałbyś zbudować? Co próbowaliście, gdzie zawiedliście? –

+0

Właściwie muszę utworzyć zapytanie wyboru; gdzie muszę zaktualizować klauzulę where na podstawie przekazanych parametrów. Podobnie jak z interfejsu użytkownika przekazuję niektóre filtry i chcę dynamicznie dodawać do mojego stanu WHERE. – user1900723

Odpowiedz

25

jOOQ ma dwa typy interfejsów API do konstruowania zapytań.

  • Interfejs API DSL umożliwiający tworzenie wbudowanych instrukcji SQL w kodzie Java, np.

  • "Modelowy" interfejs API, który pozwala na przyrostowe budowanie SQL. W każdej chwili można uzyskać dostęp do „model” API dzięki metodzie getQuery() na obiekcie zapytania DSL

przykładem tego, co chcesz zrobić, jest podana w instrukcji tutaj:

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

Na przykład, ewentualnie dodając dołączenie:

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

też optinally dodawanie warunki/orzeczniki:

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

UPDATE: Biorąc pod uwagę wasze komentarze, to jest to, czego szukasz:

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

Uwaga, można również użyć Field.compare(Comparator, Object) metody:

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

Aby uzyskać więcej informacji, rozważyć org.jooq.SelectQuery Javadoc

+0

Ale mam jeszcze jedno pytanie. Czy mogę używać zmiennych java w zapytaniu (konkretnie w części addConditions), dzięki czemu mogę umieścić wartość tych zmiennych w czasie wykonywania. na przykład Nazwa kolumny. – user1900723

+0

@ user1900723: Co powstrzymuje cię przed przypisaniem tych elementów do zmiennych w Javie? –

+0

Pozwól mi wyjaśnić ci scenariusz. Właściwie to mam kilka kolumn, które muszę przeszukać w tabeli. Na przykład: Imię, ID, Data. i muszę pobrać dane zgodnie z nimi, mając jeden inny parametr, który zawiera wartości takie jak RÓWNEJ, ZACZYNA SIĘ (potrzeba użycia takiego operatora), ENDS WITH (trzeba użyć takiego operatora). Muszę robić to wszystko dynamicznie. Tak więc, potrzebuję użyć zmiennej, aby móc umieścić wartość w locie. Proszę dać mi znać, jeśli potrzebujesz dalszych wyjaśnień. Utknąłem tutaj. – user1900723

Powiązane problemy