我正在尝试使用 jOOQ 在一些通用代码中构建 SQL 查询。我对使用 jOOQ 执行这些查询或检查结果不感兴趣。另外,这段代码是通用的,所以我不能使用 jOOQ 的代码生成。
我已经弄清楚了这么多:
List<org.jooq.Field<?>> fields = new ArrayList<org.jooq.Field<?>>();
Field<?> field = Factory.field("somefield");
fields.add(field);
field = Factory.field("someotherfield");
fields.add(field);
Field<Object> fieldPK = Factory.field("somePKField");
Condition condition = fieldPK.equal(123);
Factory factory = new Factory(connection, SQLDialect.POSTGRES);
SelectFinalStep step = factory.select(fields).from("sometable").where(condition);
String query = step.getQuery().getSQL(true);
但 Factory.field() 和 from() 采用通用 SQL 而不是实际的表或字段名称,因此没有引用(即使在使用 RenderNameStyle.QUOTED 时),也没有针对 SQL 注入(inject)的保护。
有什么方法可以创建知道名称的字段或表吗?理想情况下,我可以通过名称和父表来指定一个字段,jOOQ 会为我构建“sometable”、“somefield”字符串。
最佳答案
jOOQ 知道 org.jooq.Name
键入哪些模型标识符。它可以用 DSL.name(String...)
构造来自字符串形式的完全限定名称,例如:
Name name1 = name("column");
Name name2 = name("table", "column");
Name name3 = name("schema", "table", "column");
Name name4 = name("catalog", "schema", "table", "column");
然后您可以将这样的名称传递给 DSL.field(Name)
构造函数,例如:
Field<Object> field1 = field(name("table", "column"));
Field<String> field2 = field(name("table", "column"), String.class);
在 jOOQ 版本上
旁注:这个问题是在 jOOQ 2.x 的背景下提出的,但很少有人仍在使用这个旧版本,这就是为什么这个答案假设使用 jOOQ 3.x
关于java - 按名称实例化 jooq Field<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10264001/