我正在尝试使用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”字符串。
答案 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 2.x的背景下提出的,但很少有人仍在使用这个旧版本,这就是为什么这个答案假定使用jOOQ 3.x