实例化jooq字段<>按名字

时间:2012-04-21 23:39:12

标签: java jooq

我正在尝试使用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”字符串。

1 个答案:

答案 0 :(得分:14)

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