有没有办法在不事先知道列名的情况下动态生成JOOQ sql语句?

时间:2018-01-12 03:57:27

标签: java jooq

我正在尝试组合一个SQL生成器,因此我可以动态构建SQL语句,并将它们传递给Spark Job Server。 当表格列事先知道时,似乎很容易(使用JOOQ):

String sql = DSL.select(field("field-1"), field("field-2"), field("field-3"))
        .from(table("myTable"))

但是,这里的目标是能够解析传入的HTTP POST,从中获取JSON模式,并根据JSON中描述的表结构生成SQL select语句。

...

List<String> fieldNames = new ArrayList<>();
fieldNames.add("field-1");
fieldNames.add("field-2");
fieldNames.add("field-3");

...

JOOQ“field”似乎是一个强类型对象。

有没有办法构建这样的JOOQ select语句,使用这种动态构造的列列表?

1 个答案:

答案 0 :(得分:2)

使用jOOQ构建的每个查询都是dynamic SQL query。例如,在您的第一个示例中:

DSL.select(field("field-1"), field("field-2"), field("field-3"))
   .from(table("myTable"))

你到底做了什么?你打电话给DSL.select(SelectField, SelectField, SelectField) DSL.select(SelectField...),这是DSL.select(Collection<? extends SelectField<?>>)的便利超载,你可以像这样调用它:

SelectField[] fields = {
    field("field-1"), 
    field("field-2"), 
    field("field-3")
};
DSL.select(fields)
   .from(table("myTable"))

或者像这样,拨打https://blog.jooq.org/2017/01/16/a-functional-programming-approach-to-dynamic-sql-with-jooq/

DSL.select(Arrays.asList(fields))
   .from(table("myTable"));

永远记住,即使普通的jOOQ查询读取编写感觉像静态SQL一样,它们也是真正的动态SQL查询,并且您始终可以将不同的jOOQ查询部分分配给局部变量,或者从方法中检索它们。

在更具功能性的编程范例中使用时,这一点特别有用:

{{3}}