10

我正在尝试使用 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 注入的保护。

有没有办法创建一个知道它们的名字的字段或表?理想情况下,我可以通过名称和父表指定一个字段,jOOQ 为我构建“sometable”。“somefield”字符串。

4

1 回答 1

25

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

于 2012-04-22T10:12:36.997 回答