ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、问题来源 后端的库表设计,遵循范式原则,对于字典项,数据库里面一般存储的是整型数据,前端往往需要字符串数据,这里就存在了一个翻译的问题;这里,关联的整型字段,可能是静态字典,也可能是动态字典,或者是静态级联字典,还可能是动态级联字典; ## 二、解决办法 平台提供一种翻译机制,它是用来代替交叉表关联的一种便利化措施,本质上就是动态的把表中待翻译的字段,去字典中匹配(字典翻译翻译)或者关联其他表中欲显示字段(关联实体翻译),得到的结果,追加到返回对象中去,供前端显示; ### **好处** 既能减少冗余字段的设计,也能避免在业务代码中充斥着大量的交叉表查询编码,大幅度简化代码的开发; ## 三、翻译类型 平台的字段翻译,主要非为两大类,各类字典翻译和关联实体翻译; ### **各类字典直接字段翻译** 包括静态字典、属性字典、静态级联字典、动态级联字典四大类; @RayDynamicConvertFieldOfStaticDictClass(***) @RayDynamicConvertFieldOfPropDict(***) @RayDynamicConvertFieldOfStaticCascade(***) @RayDynamicConvertFieldOfDynamicCascade(***) ### **各类字典关联字段翻译** 包括静态字典、属性字典、静态级联字典、动态级联字典四大类关联; 实质上,这里是把直接翻译的字段,改为关联字段的翻译,也就是根据当前字段,去找到关联表的某个字段,然后对该字段进行翻译; @RayDynamicConvertFieldOfStaticDictClassReferenced(***) @RayDynamicConvertFieldOfPropDictReferenced(***) @RayDynamicConvertFieldOfStaticCascadeReferenced(***) @RayDynamicConvertFieldOfDynamicCascadeReferenced(***) >[danger] Referenced后缀的,表明是间接翻译的,就是首先从关联表中做一次关联查询,得到真正待翻译的整型字段值,然后再根据翻译类型来做真正的翻译; ### **关联实体直接字段翻译** 就是主表的字段去关联另外一张表的另外一个字段; @RayDynamicConvertFieldOfEntity(***) ``` @RayDynamicConvertFieldOfEntityInPageEntity(fieldName = "staffId", refEntityName = "SysDepartment", refEntitySourceFieldName = "departmentId", refEntityTargetFieldName = "domainId") ``` ### **关联实体关联字段翻译** 就是主表的字段去关联另外一张表的另外一个字段; @RayDynamicConvertFieldOfEntityReferenced(***) ``` @RayDynamicConvertFieldOfEntityReferencedInPageEntity(fieldName = "staffId", refReferencedEntityName = "SysDepartment", refReferencedEntitySourceField = "departmentId", refReferencedEntityTargetField = "domainId", refEntityName = "SysDomain", refEntitySourceFieldName = "domainId", refEntityTargetFieldName = "domainName") ``` 获取当前列表中的用户(staffId)的部门(departmentId)所属单位的单位名称(domainName); ## 四、使用场景 一共分为三类,分页列表、普通列表和单个实体; 对应注解后缀规则如下; | 序号 | 场景 | 后缀 | | --- | --- | --- | | 1 | 分页列表 | ***InPageEntity | | 2 | 普通列表 | ***InListEntity | | 3 | 单个实体 | ***InSingleEntity | ## 五、翻译规则 1、如果一个业务中,一个字段需要翻译成多个字段,如果没有自行设定translatedFieldName属性,那么,从第2个字段起,翻译后的字段命名为 ***Translated2,***Translated3......; 2、如果一个方法,由多个相同的翻译类型注解,用对应的group标注来包裹同类型翻译注解字段; 3、必须注意到,这个翻译后的字段是动态生成的,不能直接拿来传到后台做查询、分页、排序等字段; 4、对于Referenced系列的翻译,其首先通过refReferencedEntitySourceField字段去获取refReferencedEntityName的refReferencedEntityTargetField字段值,然后通过该值,去做后续的翻译(后续的翻译就等同不带Referenced系列翻译了);