Question

My question is similar to

Is there any good dynamic SQL builder library in Java?

However one important point taken from above thread:

Querydsl and jOOQ seem to be the most popular and mature choices however there's one thing to be aware of: Both rely on the concept of code generation, where meta classes are generated for database tables and fields. This facilitates a nice, clean DSL but it faces a problem when trying to create queries for databases that are only known at runtime.

Is there any way to create the queries at runtime besides just using plain JDBC + String concatenation?

What I'm looking for is a web application that can be used to build forms to query existing databases. Now if something like that already exists links to such a product would be welcome too.

Was it helpful?

Solution

While source code generation for database meta data certainly adds much value to using jOOQ, it is not a prerequisite. Many jOOQ users use jOOQ for the same use-case that you envision. This is also reflected in the jOOQ tutorials, which list using jOOQ without code generation as a perfectly valid use-case. For example:

String sql = create.select(
                        fieldByName("BOOK","TITLE"), 
                        fieldByName("AUTHOR","FIRST_NAME"), 
                        fieldByName("AUTHOR","LAST_NAME"))
                   .from(tableByName("BOOK"))
                   .join(tableByName("AUTHOR"))
                   .on(fieldByName("BOOK", "AUTHOR_ID").eq(
                        fieldByName("AUTHOR", "ID")))
                   .where(fieldByName("BOOK", "PUBLISHED_IN").eq(1948))
                   .getSQL();

In a similar fashion, bind values can be extracted from any Query using Query.getBindValues().

This approach will still beat plain JDBC + String concatenation for dynamic SQL statements, as you do not need to worry about:

  • Syntax correctness
  • Cross-database compatibility
  • SQL Injection
  • Bind variable indexing

(Disclaimer: I work for the vendor of jOOQ)

OTHER TIPS

SQLBuilder http://openhms.sourceforge.net/sqlbuilder/ is very useful for me. Some simple examples:

    String query1 = new InsertQuery("table1")
            .addCustomColumn("s01", "12")
            .addCustomColumn("stolbez", 19)
            .addCustomColumn("FIRSTNAME", "Alexander")
            .addCustomColumn("LASTNAME", "Ivanov")
            .toString();

    String query2 = new UpdateQuery("table2")
            .addCustomSetClause("id", 1)
            .addCustomSetClause("FIRSTNAME", "Alexander")
            .addCustomSetClause("LASTNAME", "Ivanov")
            .toString();

Results:

INSERT INTO table1 (s01,stolbez,FIRSTNAME,LASTNAME) VALUES ('12',19,'Alexander','Ivanov')
UPDATE table2 SET id = 1,FIRSTNAME = 'Alexander',LASTNAME = 'Ivanov'

I have a custom solution for dynamically generating such SQL queries with just 2-3 classes for similar requirement. It is a simple approch.

This can be referred at Creating Dynamic SQL queries in Java

For simpler use cases like a dynamic filter condition based on the inputs selected from UI, one can use the below simpler approach by directly modifying the query in below style:

select t1.id, t1.col1, t1.col2,
  from table1 t1
where (:col1Value is null or t1.col1 = :col1Value)
    and (:col2Value is null or t1.col2 = :col2Value);

Here values for col1 or col2 can be null but the query will work fine.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top