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