字段类型和推断策略
模型字段类型声明
定义模型字段时需要指定字段类型,Trantor 基于元数据管理的角度出发,提供了一套不同于 Java 类型的自有字段类型(FieldType),我们可以通过配置 @Field 声明注解的 type 属性明确指模型定字段的 Trantor 字段类型。
目前 Trantor 自有的字段类型全部在 io.terminus.trantorframework.api.annotation.FieldType 中进行了声明,我们提取成下列表格:
| FieldType | 类型描述 | 数值 | 文本 | 日期 | Json | 支持检索 | 单一对象 | 多对象 |
|---|---|---|---|---|---|---|---|---|
| Text | varchar | √ | √ | |||||
| MultiText | varchar | √ | √ | |||||
| RichText | mediumtext | √ | √ | |||||
| Date | datetime | √ | ||||||
| DateTime | datetime | √ | ||||||
| Time | time | √ | ||||||
| Int | 整型 | √ | ||||||
| Float | 浮点型 | √ | ||||||
| Currency | 货币类型 | √ | ||||||
| Percent | 百分比类型 | √ | ||||||
| Boolean | Boolean | |||||||
| Enum | enum | |||||||
| Dictionary | 字典类型,可扩展的枚举类型 | √ | ||||||
| MultiDictionary | 多字典 | √ | ||||||
| Image | 图像类型,值为 image url | √ | ||||||
| Password | password | √ | ||||||
| √ | √ | |||||||
| Phone | phone | √ | √ | |||||
| Json | mediumtext | √ | ||||||
| Link | 关联单个 java object | √ | ||||||
| LinkMany | 关联多个 java object | √ | ||||||
| LookupOne | 反查单个 java object | √ | ||||||
| LookupMany | 反查多个 java object | √ | ||||||
| Attachment | 附件文件 | √ | ||||||
| GeoLocation | 地理位置 | √ | ||||||
| GeoArea | 地理区域 | √ |
**支持检索:**指允许在 io.terminus.trantorframework.api.annotation.FieldGroup#fieldName 属性中配置生效的字段类型,如果配置了不支持检索的模型字段,字段将不会生效,不会参与到前端视图 Table 数据容器全局搜索 / 关键字搜索。
@Data@Model(name = "员工", mainField = Staff.name_field, fieldGroups = { @FieldGroup(type = FieldGroupType.SEARCHABLE, fieldName = { Staff.name_field, Staff.mobileNumber_field, Staff.address_field }) })public class Staff extends BaseModel<Long> {
@Field(name = "姓名") private String name; @Field(name = "手机号码", type = FieldType.Phone) private String mobileNumber; @Field(name = "邮箱", type = FieldType.Email) private String email; @Field(name = "出生日期") private Date birthday; @Field(name = "居住地址") private String address; @Transient @Field private int age;}类型推断
除了明确指定 @Field(type=...) 这种显式方式去定义模型字段的类型外,Trantor 还提供了一种 类型推断 的机制,即在未定义字段类型 @Field(type=...) 的前提下,Trantor 会根据当前字段的 Java 类型以及 Meta-Annotation 声明信息主动推断模型字段所属 Trantor 类型信息 FieldType,推断规则映射表如下:
| Java 类型 | Meta annotation | Trantor 类型 |
|---|---|---|
| java.lang.String | FieldType.Text | |
| Collection<java.lang.String> | FieldType.MultiText | |
| java.lang.String | @JsonMeta | FieldType.Json |
| java.lang.String | @ImageMeta | FieldType.Image |
| java.lang.String | @DictionaryMeta | FieldType.Dictionary |
| Collection<java.lang.String> | @DictionaryMeta | FieldType.MultiDictionary |
| java.lang.Integer | FieldType.Int | |
| java.lang.Long | FieldType.Int | |
| java.lang.Short | FieldType.Int | |
| java.math.BigInteger | FieldType.Int | |
| java.lang.Float | FieldType.Float | |
| java.lang.Double | FieldType.Float | |
| java.math.BigDecimal | FieldType.Float | |
| java.lang.Float | @FloatMeta(percentage = true) | FieldType.Percent |
| java.lang.Double | @FloatMeta(percentage = true) | FieldType.Percent |
| java.math.BigDecimal | @FloatMeta(percentage = true) | FieldType.Percent |
| io.terminus.trantorframework.api.type.Currency | FieldType.Currency | |
| java.lang.Boolean | FieldType.Boolean | |
| java.util.Date | FieldType.Date | |
| java.util.Date | @TimeMeta | FieldType.Time |
| java.util.Date | @DateTimeMeta | FieldType.DateTime |
| java.time.LocalDate(已废弃) | FieldType.Date | |
| java.time.LocalTime | FieldType.Time | |
| java.time.LocalDateTime | FieldType.DateTime | |
| io.terminus.trantorframework.api.type.Attachment | FieldType.Attachment | |
| io.terminus.trantorframework.api.type.GeoLocation | FieldType.GeoLocation | |
| io.terminus.trantorframework.api.type.GeoCircle | FieldType.GeoArea | |
| io.terminus.trantorframework.api.type.GeoPolygon | FieldType.GeoArea | |
| io.terminus.trantorframework.api.type.GeoEnvelope | FieldType.GeoArea | |
| java.io.Serializable | FieldType.Identifier | |
| Class<? extends RootModel> | @LinkMeta | FieldType.Link |
| Collection<Class<? extends RootModel>> | @LinkMeta | FieldType.LinkMany |
| Class<? extends RootModel> | @LookupMeta | FieldType.LookupOne |
| Collection<Class<? extends RootModel>> | @LookupMeta | FieldType.LookupMany |