Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating JOOQ query dynamically

Tags:

java

sql

jooq

I need to create a JOOQ SELECT query dynamically based on the set of parameters. I dont know how to append it dynamically. Please help

Thanks in advance.

like image 432
user1900723 Avatar asked Dec 27 '12 07:12

user1900723


People also ask

How do I create a dynamic select query in SQL?

Syntax for dynamic SQL is to make it string as below : 'SELECT statement'; To run a dynamic SQL statement, run the stored procedure sp_executesql as shown below : EXEC sp_executesql N'SELECT statement';

How do you execute a dynamic query?

Executing dynamic SQL using sp_executesql sp_executesql is an extended stored procedure that can be used to execute dynamic SQL statements in SQL Server. we need to pass the SQL statement and definition of the parameters used in the SQL statement and finally set the values to the parameters used in the query.

What are the three ways that dynamic SQL can be executed?

What are the three ways that Dynamic SQL can be executed? Writing a query with parameters. Using EXEC. Using sp_executesql.


1 Answers

jOOQ has two types of APIs to construct queries.

  • The DSL API that allows for creating inline SQL statements in your Java code, e.g.

    create.select(T.A, T.B).from(T).where(T.X.eq(3).and(T.Y.eq(5)));
    
  • The "model" API that allows for incremental SQL building. At any time, you can access the "model" API through the getQuery() method on a DSL query object

An example of what you want to do is given in the manual here:

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

For instance, optionally adding a join:

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

Or, optinally adding conditions / predicates:

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

UPDATE: Given your comments, that's what you're looking for:

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

Note, you can also use the Field.compare(Comparator, Object) methods:

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

For more info, consider the org.jooq.SelectQuery Javadoc

like image 184
Lukas Eder Avatar answered Sep 16 '22 15:09

Lukas Eder