我的问题类似于
Is there any good dynamic SQL builder library in Java?
然而,从上面的主题中得出一个重点:
Querydsl和jOOQ似乎是最受欢迎和最成熟的选择,但有一点需要注意:两者都依赖于代码生成的概念,其中为数据库表和字段生成元类。这有利于一个漂亮,干净的DSL,但是在尝试为仅在运行时知道的数据库创建查询时会遇到问题。
除了使用普通的JDBC + String连接之外,还有什么方法可以在运行时创建查询吗?
我正在寻找的是一个Web应用程序,可用于构建表单以查询现有数据库。现在,如果已经存在这样的产品,也欢迎链接到这样的产品。
答案 0 :(得分:2)
虽然数据库元数据的源代码生成确实为使用jOOQ增加了很多价值,但它不是先决条件。许多jOOQ用户使用jOOQ来实现您想象的相同用例。这也反映在jOOQ tutorials中,该列表使用jOOQ而没有代码生成作为完全有效的用例。例如:
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();
以类似的方式,可以使用Query.getBindValues()从任何查询中提取绑定值。
这种方法仍将胜过动态SQL语句的纯JDBC +字符串连接,因为您不必担心:
(免责声明:我为jOOQ的供应商工作)
答案 1 :(得分:0)
SQLBuilder http://openhms.sourceforge.net/sqlbuilder/对我非常有用。 一些简单的例子:
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();
结果:
INSERT INTO table1 (s01,stolbez,FIRSTNAME,LASTNAME) VALUES ('12',19,'Alexander','Ivanov')
UPDATE table2 SET id = 1,FIRSTNAME = 'Alexander',LASTNAME = 'Ivanov'
答案 2 :(得分:0)
我有一个自定义解决方案,用于动态生成此类 SQL 查询,只需 2-3 个类即可满足类似要求。这是一个简单的方法。
这可以参考Creating Dynamic SQL queries in Java
对于更简单的用例,例如基于从 UI 中选择的输入的动态过滤条件,可以通过直接修改以下样式的查询来使用以下更简单的方法:
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);
此处 col1 或 col2 的值可以为 null,但查询将正常工作。