我试图将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“字段”似乎是强类型对象。

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

最佳答案

用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...)的便利重载,您可以像这样调用它:

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


或这样,调用DSL.select(Collection<? extends SelectField<?>>)

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


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

在更实用的编程范例中使用时,这特别有用:

https://blog.jooq.org/2017/01/16/a-functional-programming-approach-to-dynamic-sql-with-jooq/

关于java - 有没有一种方法可以动态生成JOOQ sql语句而无需事先知道列名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48219317/

10-13 01:13