java - 按名称实例化 jooq Field<>

标签 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 注入(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/

相关文章:

java - 我应该如何在 Java 中实现列表中的列表?或者有比列表列表更好的方法吗?

java - AES 加密初始化错误

postgresql - 如何使用 JOOQ 将 Postgres "infinity"插入时间戳字段?

java - Jooq Global Artefacts 重命名

java - 有没有办法解析jooq中的自定义函数?

java - JOOQ连接

java - 如何将类字段映射到另一个类?

java - 在身份验证之前检查用户启用状态 - Spring Security

java - 通过快速鼠标移动在 Java 2D 中绘图

java - 在 Jooq 中插入多行会引发编译错误