在 jooq/java 中创建完全限定的列名

问题描述 投票:0回答:1

我使用以下语法得到 null

 public static final Field<String> COLUMN=field(name("myid"), SQLDataType.VARCHAR)
 public static final String TABLE_NAME = "mytable";
 public static final Table<?> TABLE_WITH_SCHEMA = table("common",TABLE_NAME);
 public static final Field<String> MY_FIELD=TABLE_WITH_SCHEMA.field(COLUMN);

我在这里做错了什么?当我运行代码时

MY_FIELD
显示为null

java jooq
1个回答
0
投票

根据

Fields.field(Field)
Javadoc:

获取此类型通过非限定名称已知的字段,或者

null
(如果此类型没有通过此名称已知的字段)。

Fields.field()
方法不用于创建新引用,而是用于从
Table
查找现有(已知)引用。您的
table("common")
实例只是一个 plain SQL 模板。它对其结构一无所知。请注意,将
TABLE_NAME
传递给它没有任何效果,因为您只是将“绑定值”传递给不需要绑定值的模板。

如果您想使用限定名称,始终使用

DSL.name()
,就像使用
COLUMN
一样,例如:

Table<?> TABLE_WITH_SCHEMA = table(name("common", TABLE_NAME));
Field<String> MY_FIELD = field(name("common", TABLE_NAME, "myid"), VARCHAR);

如果您的根本问题是关于重用限定名称前缀,那么您可以使用

Name
API 来实现此目的,例如:

Table<?> TABLE_WITH_SCHEMA = table(name("common", TABLE_NAME));
Field<String> MY_FIELD = field(
    TABLE_WITH_SCHEMA.getQualifiedName().append("myid"), 
    VARCHAR
);

使用代码生成的注意事项

除非您的架构确实是动态的,否则请考虑使用代码生成器。使用这些基于标识符的表/字段变得非常麻烦,并且仅当架构在编译时未知时才有用。否则,代码生成会极大地简化您的生活,并允许许多其他方式无法使用的用例(例如隐式联接)。

© www.soinside.com 2019 - 2024. All rights reserved.