模型定义在数据库中的映射

模型定义在数据库中的映射

Oinone中通过定义模型来建立数据表,使用注解的方式来使多张表之间的关联。

  1. 数据库字段与模型定义字段映射

    模型定义在数据库中的映射

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.core.common.enmu.DataStatusEnum;
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    import pro.shushi.pamirs.meta.enmu.DateFormatEnum;
    import pro.shushi.pamirs.meta.enmu.DateTypeEnum;
    import pro.shushi.pamirs.meta.enmu.MimeTypeEnum;
    
    import java.math.BigDecimal;
    import java.util.Date;
    
    @Model.model(PamirsDemo.MODEL_MODEL)
    @Model(displayName = "PamirsDemo")
    public class PamirsDemo extends IdModel {
    
       public static final String MODEL_MODEL = "top.PamirsDemo";
    
       @Field.Binary(mime = MimeTypeEnum.html)
       @Field(displayName = "二进制类型")
       private Byte[] byteType;
    
       @Field.Integer
       @Field(displayName = "整数")
       private Long longType;
    
       @Field.Float
       @Field(displayName = "浮点数")
       private BigDecimal floatType;
    
       @Field.Boolean
       @Field(displayName = "布尔类型")
       private Boolean booleanType;
    
       @Field.Enum
       @Field(displayName = "枚举")
       private DataStatusEnum enumType;
    
       @Field.String
       @Field(displayName = "字符串")
       private String stringType;
    
       @Field.Text
       @Field(displayName = "多行文本")
       private String textType;
    
       @Field.Html
       @Field(displayName = "富文本")
       private String richText;
    
       @Field.Date(type = DateTypeEnum.DATE, format = DateFormatEnum.DATE)
       @Field(displayName = "日期类型")
       private Date dataType;
    
       @Field.Date(type = DateTypeEnum.DATETIME, format = DateFormatEnum.DATETIME)
       @Field(displayName = "日期时间类型")
       private Date dataTimeType;
    
       @Field.Money
       @Field(displayName = "金额")
       private BigDecimal amount;
    }
    

    更多字段基础请参考文档字段基础与复合

  2. 多对一的关系映射

    例:设计一张教师表,一张科目表,教师表对科目表属于多对一的关系,在教师表中使用科目id管理关联关系。

    教师表teacher

    模型定义在数据库中的映射

    科目表professional

    模型定义在数据库中的映射


    那么在Oinone的模型定义中,这两张表定义是这样的;

    教师模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    
    @Model.model(Teacher.MODEL_MODEL)
    @Model(displayName = "教师", summary = "教师")
    public class Teacher extends IdModel {
    
       public static final String MODEL_MODEL = "top.Teacher";
    
       @Field.String
       @Field(displayName = "教师名字")
       private String teacherName;
    
       @Field.Integer
       @Field(displayName = "科目id")
       private Long professionalId;
    
       @Field(displayName = "关联科目")
       @Field.many2one
       @Field.Relation(relationFields = {"professionalId"},referenceFields = {"id"})
       private Professional professional;
    }
    

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    科目模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    
    import java.util.List;
    
    @Model.model(Professional.MODEL_MODEL)
    @Model(displayName = "科目", summary = "科目")
    public class Professional extends IdModel {
    
       public static final String MODEL_MODEL = "top.Professional";
    
       @Field.String
       @Field(displayName = "科目名称")
       private String professionalName;
    
    }

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    使用@Field.many2one注解管理教师与科目的多对一关系,在表操作时会自动维护关联关系。如果业务上是一对一的关系,在模型定义中建议使用多对一进行关联。

  3. 一对多的关系映射

    例:设计一张学生表,一张科目表,学生表对科目表属于一对多的关系,在科目表里使用学生ID与学生表进行关联。

    学生表student
    模型定义在数据库中的映射
    科目表professional
    模型定义在数据库中的映射


    那么在Oinone的模型定义中,这两张表定义是这样的;
    学生模型

    package pro.shushi.pamirs.top.api.model;
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    @Model.model(Student.MODEL_MODEL)
    @Model(displayName = "学生", summary = "学生")
    public class Student extends IdModel {
    
        public static final String MODEL_MODEL = "top.Student";
    
        @Field(displayName = "学生名字")
        @Field.String
        private String studentName;
    
        @Field(displayName = "学生ID")
        @Field.Integer
        private Long studentId;
    }
    

    该模型创建的数据库如下:
    模型定义在数据库中的映射

    科目模型

     package pro.shushi.pamirs.top.api.model;
    
     import pro.shushi.pamirs.meta.annotation.Field;
     import pro.shushi.pamirs.meta.annotation.Model;
     import pro.shushi.pamirs.meta.base.IdModel;
    
     import java.util.List;
    
     @Model.model(Professional.MODEL_MODEL)
     @Model(displayName = "科目", summary = "科目")
     public class Professional extends IdModel {
    
     public static final String MODEL_MODEL = "top.Professional";
    
         @Field.String
        @Field(displayName = "科目名称")
        private String professionalName;
    
        @Field(displayName = "关联学生")
        @Field.one2many
        @Field.Relation(relationFields = {"id"},referenceFields = {"studentId"})
        private List<Student> studentList;
    }

    在科目模型中建立@Field.one2many来管理学生和科目的关联关系。该模型创建的数据库如下:
    模型定义在数据库中的映射

  4. 多对多关系的关系映射

    例:设计一张教师表,一张学生表,教师表对学生表属于多对多的关系,使用中间表管理教师和学生的关联关系。

    教师表teacher

    模型定义在数据库中的映射

    学生表student

    模型定义在数据库中的映射

    教师学生中间表teacher_rel_student

    模型定义在数据库中的映射


    那么在Oinone的模型定义中,多对多关系是这样定义的;

    教师模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    
    import java.util.List;
    
    @Model.model(Teacher.MODEL_MODEL)
    @Model(displayName = "教师", summary = "教师")
    public class Teacher extends IdModel {
    
       public static final String MODEL_MODEL = "top.Teacher";
    
       @Field.String
       @Field(displayName = "教师名字")
       private String teacherName;
    
       @Field(displayName = "教师关联学生")
       @Field.many2many(through = TeacherRelStudent.MODEL_MODEL, relationFields = {"teacherId"}, referenceFields = {"studentId"})
       @Field.Relation(relationFields = {"id"}, referenceFields = {"id"})
       private List<Student> studentList;
    }

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    学生模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    
    @Model.model(Student.MODEL_MODEL)
    @Model(displayName = "学生", summary = "学生")
    public class Student extends IdModel {
    
       public static final String MODEL_MODEL = "top.Student";
    
       @Field(displayName = "学生名字")
       @Field.String
       private String studentName;
    }

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    教师学生关系模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.BaseRelation;
    
    @Model.model(TeacherRelStudent.MODEL_MODEL)
    @Model(displayName = "教师学生关系表", summary = "教师学生关系表")
    public class TeacherRelStudent extends BaseRelation {
    
       public static final String MODEL_MODEL = "top.TeacherRelStudent";
    
       @Field.Integer
       @Field(displayName = "教师ID")
       private Long teacherId;
    
       @Field.Integer
       @Field(displayName = "学生ID")
       private Long studentId;
    }

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    使用@Field.many2many注解以及中间管理关联关系,在表操作时自动维护关联关系。

Oinone社区 作者:yexiu原创文章,如若转载,请注明出处:https://doc.oinone.top/dai-ma-shi-jian/16109.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(1)
yexiu的头像yexiu数式员工
上一篇 2024年8月16日 pm4:24
下一篇 2024年8月17日 pm3:50

相关推荐

  • Oinone登录扩展:对接SSO(适应于4.7.8及之后的版本)

    适配版本 4.7.8及其之后的版本 概述 在企业内部,对于已有一套完整的登录系统(SSO)的情况下,通常会要求把所有的系统都对接到SSO中;本文主要讲解用Oinone开发的项目对接SSO的具体实现。 对接步骤 1、项目自定义实现UserCookieLogin,可参考示例说明:pro.shushi.pamirs.user.api.login.UserCookieLoginFree 2、对接SSO示例 package pro.shushi.pamirs.demo.core.sso; import com.alibaba.fastjson.JSON; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import pro.shushi.pamirs.demo.core.sso.constant.HttpConstant; import pro.shushi.pamirs.demo.core.sso.constant.SessionUserTypeEnum; import pro.shushi.pamirs.demo.core.sso.model.ApiCommonTransient; import pro.shushi.pamirs.demo.core.sso.model.PermissionInfoResp; import pro.shushi.pamirs.demo.core.sso.utils.AuthenticateUtils; import pro.shushi.pamirs.meta.annotation.fun.extern.Slf4j; import pro.shushi.pamirs.meta.api.dto.model.PamirsUserDTO; import pro.shushi.pamirs.meta.api.session.PamirsSession; import pro.shushi.pamirs.meta.common.exception.PamirsException; import pro.shushi.pamirs.meta.common.spring.BeanDefinitionUtils; import pro.shushi.pamirs.resource.api.enmu.UserSignUpType; import pro.shushi.pamirs.user.api.cache.UserCache; import pro.shushi.pamirs.user.api.constants.UserConstant; import pro.shushi.pamirs.user.api.enmu.UserExpEnumerate; import pro.shushi.pamirs.user.api.enmu.UserLoginTypeEnum; import pro.shushi.pamirs.user.api.login.IUserLoginChecker; import pro.shushi.pamirs.user.api.login.UserCookieLogin; import pro.shushi.pamirs.user.api.login.UserCookieLoginSimple; import pro.shushi.pamirs.user.api.model.PamirsUser; import pro.shushi.pamirs.user.api.model.tmodel.PamirsUserTransient; import pro.shushi.pamirs.user.api.service.UserService; import pro.shushi.pamirs.user.api.utils.CookieUtil; import javax.servlet.http.HttpServletResponse; /** * * @author shushi * * 完全自定义login的过程 * 需要实现登陆部分login 以及拦截部分fetchUserIdByReq * 如果fetchUserIdByReq返回值为null的时候 将会被拦截 */ @Slf4j @Order(0) @Component public class DemoUserSSOCookieLogin extends UserCookieLogin<PamirsUser> { //刷新令牌 private static String REFRESH_TOKEN = "refreshToken"; //系统id private static String CLIENT_ID = "client-id"; //访问令牌 private static String AUTHORIZATION = "Authorization"; private IUserLoginChecker checker; @Autowired private UserService userService; @Autowired private RedisTemplate<String, String> redisTemplate; @Override public String type() { return UserLoginTypeEnum.COOKIE.value(); } @Override public PamirsUser resolveAndVerification(PamirsUserTransient user) { if (checker == null) { checker = BeanDefinitionUtils.getBean(IUserLoginChecker.class); } return checker.check4login(user); } /** * 重写登录拦截功能 * 该函数主要作用,通过三方权限校验. * @return */ // 版本升级需要修改 @Override public PamirsUserDTO fetchUserIdByReq() { String sessionId = PamirsSession.getSessionId(); PamirsUserDTO pamirsUserDTO = UserCache.get(sessionId); if (pamirsUserDTO ==null) { //H5-企业微信登录,其他SSO登录。获取标识…

    2024年4月2日
    1.2K00
  • 系统图标使用自定义CDN地址(内网部署)

    在实际项目中,客户网络环境不能访问外网即纯内网部署。此时需要将所有的静态资源都放在客户内部的CDN上,该篇详细说明实现步骤。 实现步骤 1、把图片等静态资源上传到本地CDN上(如MINIO、Nginx等),图片等静态资源找 数式支持人员 提供; 【注意】:MINIO情况,放置图片等静态资源的桶权限需设置为公共读; 2、项目中YAML的OSS配置,使用本地CDN、并指定使用的本地CDN图标的标识appLogoUseCdn: true, OSS配置参考如下: 本地CDN使用MINIO(仅示例需根据实际情况修改) cdn: oss: name: MINIO type: MINIO # MINIO的配置根据实际情况修改 bucket: pamirs(您的bucket) # 上传和下载地址根据实际情况修改 uploadUrl: http://39.103.145.77:9000 downloadUrl: http://39.103.145.77:9000 accessKeyId: 您的accessKeyId accessKeySecret: 您的accessKeySecret # mainDir对用CDN的图片目录,根据项目情况自行修改 mainDir: upload/demo/ validTime: 3600000 timeout: 600000 active: true referer: # 使用客户自己的CDN的图片,否则系统默认的从数式的CDN中获取 appLogoUseCdn: true 或本地CDN使用Nginx(仅示例需根据实际情况修改) cdn: oss: name: 本地文件NG系统 type: LOCAL bucket: # uploadUrl 这个是Oinone后端服务地址和端口 uploadUrl: http://192.168.0.129:8099 # downloadUrl前端地址,即直接映射在nginx的静态资源的路径和端口 downloadUrl: http://192.168.0.129:9999 validTime: 3600000 timeout: 600000 active: true referer: # 本地Nginx静态资源目录 localFolderUrl: /opt/pamirs/static # 使用客户自己的CDN的图片,否则系统默认的从数式的CDN中获取 appLogoUseCdn: true 3、前端工程3.1 前端源码工程,在.evn中把 STATIC_IMG地址进行修改;http(https)、IP和端口改成与CDN对应的配置,URL中/oinone/static/images是固定的;例如: 本地CDN使用MINIO(仅示例需根据实际情况修改) STATIC_IMG: 'http://39.103.145.77:9000/pamirs(这里替换为OSS中的bucket)/oinone/static/images' 或本地CDN使用Nginx(仅示例需根据实际情况修改) STATIC_IMG: 'http://192.168.0.129:9999/static/oinone/static/images' 3.2 对于已经打包好的前端资源对于已打包好的前端资源即无法修改.evn的情况;需在前端资源的根目录,新建config/manifest.js. 如果已存在则不需要新建,同时原来的内容也不需要删除(追加即可),需增加的配置: 本地CDN使用MINIO(仅示例需根据实际情况修改) runtimeConfigResolve({ STATIC_IMG: 'http://39.103.145.77:9000/pamirs(这里替换为OSS中的bucket)/oinone/static/images', plugins: { usingRemote: true } }) 或本地CDN使用Nginx(仅示例需根据实际情况修改) runtimeConfigResolve({ STATIC_IMG: 'http://192.168.0.129:9999/static/oinone/static/images', plugins: { usingRemote: true } })

    2025年2月8日
    46200
  • 代码示例:快速找到示例代码

    1、图表设计器 数据可视化能加载到的接口,方法上需要加 category = FunctionCategoryEnum.QUERY_PAGE @Model.model(ExpensesIncome.MODEL_MODEL) @Component @Slf4j public class ExpensesIncomeAction { @Function.Advanced(type = FunctionTypeEnum.QUERY,category = FunctionCategoryEnum.QUERY_PAGE) @Function.fun(FunctionConstants.queryPage) @Function(openLevel = {FunctionOpenEnum.API}) public Pagination<ExpensesIncome> queryPage(Pagination<ExpensesIncome> page, IWrapper<ExpensesIncome> queryWrapper) { page = new ExpensesIncome().queryPage(page, queryWrapper); if (page!=null && CollectionUtils.isNotEmpty(page.getContent())) { page.getContent().forEach(a->{ if (a.getBudgetInCome()!=null && a.getBudgetInCome().compareTo(new BigDecimal("0.0"))!=0) { if (a.getRetailAmount()!=null) { a.setInComeRate(a.getRetailAmount().divide(a.getBudgetInCome(),2)); } } }); } return page; } } 2、事务支持 1)对于单个系统(InJvm)/模型内部采用强事务的方式。比如:在库存转移时,库存日志和库存数量的变化在一个事务中,保证两个表的数据同时成功或者失败。2)强事务管理采用编码式,Oinone事务管理兼容Spring的事务管理方式;有注解的方式和代码块的方式。a) 使用注解的方式: @Override @Transactional public void awardOut(AwardBookOutEmpRecordDetail detail) { List<OutEmpRecordSubjectDetail> subjectDetails = detail.getSubjectDetails(); …… } 重要说明基于注解的事务,Bean和加注解的方法必须能被Spring切面到。 b) 使用编码方式: //组装数据/获取数据/校验 Tx.build(new TxConfig()).executeWithoutResult(status -> { // 1、保存部门数据 deliDepartmentService.createOrUpdateBatch(departments); //2、如果父进行了下级关联设置,处理下级关联设置的逻辑 for (DeliDepartment department : departments) { doDepartSubLink(department); } }); ………… 3)对于分布式事务采用最终数据一致性,借助【可靠消息】或者【Job】的方式来实现。 3、平台工具类使用 3.1 FetchUtil pro.shushi.pamirs.core.common.FetchUtil,重点关注 # 根据Id查询列表 pro.shushi.pamirs.core.common.FetchUtil#fetchMapByIds # 根据Id查询,返回Map pro.shushi.pamirs.core.common.FetchUtil#fetchListByIds # 根据Codes查询列表 pro.shushi.pamirs.core.common.FetchUtil#fetchMapByCodes # 根据Code查询,返回Map pro.shushi.pamirs.core.common.FetchUtil#fetchListByCodes # 根据Entity查询 pro.shushi.pamirs.core.common.FetchUtil#fetchOne 其他更多方法参考这个类的源代码 3.2 ListUtils pro.shushi.pamirs.meta.common.util.ListUtils # 把输入的List,按给定的长度进行分组 pro.shushi.pamirs.meta.common.util.ListUtils#fixedGrouping # 从给定的List中返回特定字段的数组,忽略Null并去重 pro.shushi.pamirs.meta.common.util.ListUtils#transform 4、枚举获取 根据枚举的name获取valueInteger value = ArchivesConfigTypeEnum.getValueByName(ArchivesConfigTypeEnum.class,“status1”);根据枚举的name获取枚举项ArchivesConfigTypeEnum typeEnum = TtypeEnum.getEnum(ArchivesConfigTypeEnum.class, “status1”); 5、Map类型的数据怎么定义,即ttype 为map的字段写法 @Field(displayName = "上下文", store = NullableBoolEnum.TRUE, serialize = JSON) @Field.Advanced(columnDefinition = "TEXT") private Map<String, Object> context; 6、后端获取前端请求中的variables PamirsRequestVariables requestVariables = PamirsSession.getRequestVariables(); 7、为什么有时候调用服务走远程了 1、假设: A模型(modelA)所在的模块(ModuleA) B模型(modelB)所在的模块(ModuleB) 部署方式决定调用方式: 1)部署方式1: ModuleA 和 ModuleB 部署在一个jvm中,此时: modelA的服务/页面去调用 modelB,因为部署在一起,直接走inJvm 2、部署方式2: ModuleA 和 ModuleB 部署在不同的jvm中; modelA的服务/页面去调用 modelB,则会走远程(RPC);此时需要: a)ModuleB 需要开启dubbo服务,且ModuleA 和 ModuleB注册中心相同…

    2024年2月20日
    83000
  • 【前端】项目开发前端知识要点地图

    概述 下面整理了目前现有的所有文章,并提供了基本的学习路径。所有使用*标记的文章属于推荐必读文章。 目录 基础篇 【路由】浏览器地址栏url参数介绍 母版-布局-DSL 渲染基础(v4)* 组件SPI机制(v4)* 组件数据交互基础(v4)* 组件生命周期(v4) 入门篇 自定义视图组件(v4)* 如何通过浏览器开发者工具提高调试效率* 如何提高自定义组件的开发效率* 自定义组件之自动渲染(组件插槽的使用)(v4)* GraphQL请求详解(v4)* 上下文在字段和动作中的应用 如何实现页面间的跳转 如何自定义指定页面的样式 进阶篇 自定义组件之手动渲染基础(v4) 自定义组件之手动渲染弹出层(v4) 自定义组件之手动渲染任意视图(v4) 【前端】IOC容器(v4) 最佳实践篇 【前端】工程结构最佳实践(v4)* 【前端】移动端工程结构最佳实践(v4)* 界面设计器实战篇 基础篇 【界面设计器】模型增删改查基础 【界面设计器】他表字段 【界面设计器】左树右表 【界面设计器】树形表格 【界面设计器】树下拉/级联选择 【界面设计器】自定义字段组件基础 展示篇 【界面设计器】自定义字段组件实战——轮播图 【界面设计器】自定义字段组件实战——表格字段组合展示 【界面设计器】自定义字段组件实战——表格字段内嵌表格 交互篇 【界面设计器】自定义字段组件实战——千分位输入框 其他 前端低无一体使用教程 如何自定义表格字段? 【界面设计器】组件开发常见问题 【前端】低无一体部署常见问题 【前端】生产环境性能调优 API文档 OioProvider详解(v4.3.0)* 前端环境配置(v4)* 默认布局模板(v4) 表格主题配置(v4) 运行时上下文API文档(v4) Class Component(ts)(v4)

    2024年5月25日
    2.9K00
  • 后端:如何自定义表达式实现特殊需求?扩展内置函数表达式

    平台提供了很多的表达式,如果这些表达式不满足场景?那我们应该如何新增表达式去满足项目的需求?目前平台支持的表达式内置函数,参考 1. 扩展表达式的场景 注解@Validation的rule字段支持配置表达式校验如果需要判断入参List类型字段中的某一个参数进行NULL校验,发现平台的内置函数不支持该场景的配置,这里就可以通过平台的机制,对内置函数进行扩展。 常见的一些代码场景,如下: package pro.shushi.pamirs.demo.core.action; ……引用类 @Model.model(PetShopProxy.MODEL_MODEL) @Component public class PetShopProxyAction extends DataStatusBehavior<PetShopProxy> { @Override protected PetShopProxy fetchData(PetShopProxy data) { return data.queryById(); } @Validation(ruleWithTips = { @Validation.Rule(value = "!IS_BLANK(data.code)", error = "编码为必填项"), @Validation.Rule(value = "LEN(data.name) < 128", error = "名称过长,不能超过128位"), }) @Action(displayName = "启用") @Action.Advanced(invisible="!(activeRecord.code !== undefined && !IS_BLANK(activeRecord.code))") public PetShopProxy dataStatusEnable(PetShopProxy data){ data = super.dataStatusEnable(data); data.updateById(); return data; } ……其他代码 } 2. 新建一个自定义表达式的函数 校验入参如果是个集合对象的情况下,单个对象的某个字段如果为空,返回false的函数。 例子:新建一个CustomCollectionFunctions类 package xxx.xxx.xxx; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Component; import pro.shushi.pamirs.meta.annotation.Fun; import pro.shushi.pamirs.meta.annotation.Function; import pro.shushi.pamirs.meta.common.constants.NamespaceConstants; import pro.shushi.pamirs.meta.util.FieldUtils; import java.util.List; import static pro.shushi.pamirs.meta.enmu.FunctionCategoryEnum.COLLECTION; import static pro.shushi.pamirs.meta.enmu.FunctionLanguageEnum.JAVA; import static pro.shushi.pamirs.meta.enmu.FunctionOpenEnum.LOCAL; import static pro.shushi.pamirs.meta.enmu.FunctionSceneEnum.EXPRESSION; /** * 自定义内置函数 */ @Fun(NamespaceConstants.expression) @Component public class CustomCollectionFunctions { /** * LIST_FIELD_NULL 就是我们自定义的表达式,不能与已经存在的表达式重复!!! * * @param list * @param field * @return */ @Function.Advanced( displayName = "校验集成的参数是否为null", language = JAVA, builtin = true, category = COLLECTION ) @Function.fun("LIST_FIELD_NULL") @Function(name = "LIST_FIELD_NULL", scene = {EXPRESSION}, openLevel = LOCAL, summary = "函数示例: LIST_FIELD_NULL(list,field),函数说明: 传入一个对象集合,校验集合的字段是否为空" ) public Boolean listFieldNull(List list, String field) { if (null == list) { return false; } if (CollectionUtils.isEmpty(list)) { return false; } for (Object data : list) { Object value =…

    2024年5月30日
    1.1K00

Leave a Reply

登录后才能评论