跳转到内容

字段类型和推断策略

模型字段类型声明

定义模型字段时需要指定字段类型,Trantor 基于元数据管理的角度出发,提供了一套不同于 Java 类型的自有字段类型(FieldType),我们可以通过配置 @Field 声明注解的 type 属性明确指模型定字段的 Trantor 字段类型。

目前 Trantor 自有的字段类型全部在 io.terminus.trantorframework.api.annotation.FieldType 中进行了声明,我们提取成下列表格:

FieldType类型描述数值文本日期Json支持检索单一对象多对象
Textvarchar
MultiTextvarchar
RichTextmediumtext
Datedatetime
DateTimedatetime
Timetime
Int整型
Float浮点型
Currency货币类型
Percent百分比类型
BooleanBoolean
Enumenum
Dictionary字典类型,可扩展的枚举类型
MultiDictionary多字典
Image图像类型,值为 image url
Passwordpassword
Emailemail
Phonephone
Jsonmediumtext
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 annotationTrantor 类型
java.lang.StringFieldType.Text
Collection<java.lang.String>FieldType.MultiText
java.lang.String@JsonMetaFieldType.Json
java.lang.String@ImageMetaFieldType.Image
java.lang.String@DictionaryMetaFieldType.Dictionary
Collection<java.lang.String>@DictionaryMetaFieldType.MultiDictionary
java.lang.IntegerFieldType.Int
java.lang.LongFieldType.Int
java.lang.ShortFieldType.Int
java.math.BigIntegerFieldType.Int
java.lang.FloatFieldType.Float
java.lang.DoubleFieldType.Float
java.math.BigDecimalFieldType.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.CurrencyFieldType.Currency
java.lang.BooleanFieldType.Boolean
java.util.DateFieldType.Date
java.util.Date@TimeMetaFieldType.Time
java.util.Date@DateTimeMetaFieldType.DateTime
java.time.LocalDate(已废弃)FieldType.Date
java.time.LocalTimeFieldType.Time
java.time.LocalDateTimeFieldType.DateTime
io.terminus.trantorframework.api.type.AttachmentFieldType.Attachment
io.terminus.trantorframework.api.type.GeoLocationFieldType.GeoLocation
io.terminus.trantorframework.api.type.GeoCircleFieldType.GeoArea
io.terminus.trantorframework.api.type.GeoPolygonFieldType.GeoArea
io.terminus.trantorframework.api.type.GeoEnvelopeFieldType.GeoArea
java.io.SerializableFieldType.Identifier
Class<? extends RootModel>@LinkMetaFieldType.Link
Collection<Class<? extends RootModel>>@LinkMetaFieldType.LinkMany
Class<? extends RootModel>@LookupMetaFieldType.LookupOne
Collection<Class<? extends RootModel>>@LookupMetaFieldType.LookupMany