-
M2O关系字段
配置示例:
@Field(displayName = "教师关联学生") @Field.many2one @Field.Relation(relationFields = {"studentName"}, referenceFields = {"name"}) private Student students;
解析:
- 在这个多对一关系中,studentName为本模型的字段,name为Student的字段,这个多对一关系通过这两个字段关联起来。
- 在保存该关联关系时,会将name的值带到studentName里并保存在当前模型中(many)
- name必须在关系模型即Student里面定义(one),studentName在本模型里面定义不定义都可以,如果没有的话会在本模型中创建该字段。
常见问题:
- 启动报错:根据报错内容进行相应修改
- 保存报错:
Duplicate entry '******' for key 'PRIMARY'
,报这个错是因为studentName是唯一键,在将相同name的值赋值给studentName时导致唯一键冲突。其他关系也会有此情况。
-
O2M关系字段
配置示例:
@Field(displayName = "教师关联宠物") @Field.one2many @Field.Relation(relationFields = {"id"}, referenceFields = {"teacherId"}) private List<PetShop> studentsCode;
解析:
- 在这个一对多关系中,id为本模型的字段,teacherId为PetShop的字段,这个一对多关系通过这两个字段关联起来。
- 在保存该关联关系时,会将id的值带到teacherId里并保存在PetShop模型中(many)
- id必须在本模型中定义(one), teacherId在PetShop模型里面定义不定义都可以,如果没有的话会在PetShop模型中创建该字段。
常见问题:
-
启动报错:根据报错内容进行相应修改
-
保存报错:请先保存关联关系模型:如果 id 为自定义字段 与 PetShop进行关联,那么保存关联关系时必须给id 赋值,不然会报错
-
M2M关系字段
配置示例1:
@Field.many2many(through = OrderRelLogistics.MODEL_MODEL, relationFields = {"parentOrderId"}, referenceFields = {"logisticsBillId"}) @Field.Relation(relationFields = {"id"}, referenceFields = {"id"}) @Field(displayName = "物流单") private List<LogisticsBill> logisticsBillList;
解析:
- 在这个多对多关系中,id(左)为本模型的字段,id(右)为PetShop的字段。OrderRelLogistics.MODEL_MODEL为中间表,在保存关联关系时中间表会维护双方的关系字段,id(左)的值写到中间表的parentOrderId字段,id(右)的值写到中间表的logisticsBillId字段。
常见问题:
- 保存报错,请先保存关联关系模型:如果id(左)为在本模型自定义的字段,则需要在保存关联关系的时候的时候将该自定义赋值,这样才能正确保存关联关系。
配置示例2:
新增TalentTypeEnum
@Dict(dictionary = TalentTypeEnum.DICTIONARY,displayName = "达人类型") public class TalentTypeEnum extends BaseEnum
{ public static final String DICTIONARY ="top.TalentTypeEnum"; public final static TalentTypeEnum DOG =create("DOG",1,"狗达人","狗达人"); public final static TalentTypeEnum CAT =create("CAT",2,"猫达人","猫达人"); } 中间表定义
@Model.model(PetItemRelPetTalent.MODEL_MODEL) @Model(displayName = "中间表", summary = "中间表") public class PetItemRelPetTalent extends BaseRelation { public static final String MODEL_MODEL = "top.PetItemRelPetTalent"; @Field.String @Field(displayName = "商店ID") private String petItemId; @Field.String @Field(displayName = "宠物ID") private String petTalentId; @Field.String @Field(displayName = "宠物类型") private TalentTypeEnum talentType; }
关系字段定义(关联关系中,使用”##“包括定义常量,这里定义常量"test")
@Field(displayName = "推荐达人") @Field.many2many( through = PetItemRelPetTalent.MODEL_MODEL, relationFields = {"petItemId"}, referenceFields = {"petTalentId","talentType"} ) @Field.Relation(relationFields = {"id"}, referenceFields = {"id", "#2#"}) private List
petTalents; 解析:
- 在这个多对多的关系中,查询时首先会查当前模型的字段,拿到当前模型的id(左),然后根据条件
petItem_id=id(左)
去查中间表,就可以在中间表里查询出多个categoryId,talentType
,然后根据条件(id(右), talenttype) IN (categoryId,talentType)
查询出关系表PetTalent
- 注意:
talentType
字段必须在关系表PetTalent中定义,并和中间表定义的字段talentType
保持一致
常见问题:
- 报错:需要配置关联模型的关联字段:原因是在PetTalent中没有定义talentType字段
配置示例3:
@Field(displayName = "类目") @Field.many2many( through = MaterialRelCategory.MODEL_MODEL, relationFields = {"materialId","type"}, referenceFields = {"categoryId"} ) @Field.Relation(relationFields = {"id", "#test#"}, referenceFields = {"id"}) private List
categoryList; 解析:
- 在这个多对多关系中,查询时首先会查当前模型的字段,拿到当前模型的id(左),然后根据条件
material_id=id(左) AND type = test
去查中间表,就可以在中间表里查询出多个categoryId
,然后根据条件id(右)IN (categoryId)
查询出关系表MaterialCategory
- 更多使用方式见文档https://doc.oinone.top/oio4/9241.html
Oinone社区 作者:yexiu原创文章,如若转载,请注明出处:https://doc.oinone.top/wen-ti-zhen-duan/15999.html
访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验