ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
![](https://box.kancloud.cn/97dfd296b6d55ca6c7e49a70ac062a8f_213x180.png) 在EovaV1.5之前的版本中,表达式都非常弱,一不小心就会出现语法错误,让人揪心! 所以EovaV1.5 采用了Druid的SQL解析引擎来解析表达式,使Eova表达式能力和兼容性大幅度提升! 语法奥秘: 1.随意空格 不会报错(建议规范书写,放开No放荡) 2.不用跟小尾巴where 1=1 3.支持变量和复杂逻辑运算(暂时只支持用户对象) 4.默认数据源为main,可以省略;ds=main(省钱又省布) 5.支持排序 order by id desc 6.支持子查询 7.复杂的多表查询通过view来解决 8.支持多列显示 9.支持智能宽度 标准语法: **下拉框** `select xxx ID, xxx CN from 表名;ds=数据源` > 语法解释: > ID CN别名为固定关键字 > ID:第1列必须对应下拉框的值项 > CN:第2列必须对应下拉框的文本项 **下拉树** `select xx ID,xx NAME,xx PID from xxx_tree_table;ds=数据源` > 语法解释: > ID NAME PID 别名为固定关键字 > ID:第1列必须对应树节点ID > NAME:第2列必须树节点名称 > PID:树节点父ID > eova-1.6-beta4 开始支持自定义根节点值 ;root=0 **查找框** `select xxx 用户ID, xxx 用户名 from 表名;ds=数据源` > 语法解释: > 别名会成为查找框弹出Dialog中Grid的列名,推荐使用中文别名 > 第1列必须对应查找框的隐藏值 > 第2列必须对应查找框的显示文本 > 隐藏功能:根据列名自动结算列显示宽度.(V1.6.0提供) > 隐藏功能:如果不写别名/或别名和字段名一样,该列会自动隐藏(V1.6.0提供) > 新手提示:没有数据源最后不要带;号 * * * * * #### **高级用法** **根据当前角色过滤数据** ~~~ select xxx ID, xxx CN from 表名 where 1=1 <%if(user.rid == 1){// A角色只看A数据%> and type = 1 <%}%> <%if(user.rid == 2){// B角色只看B数据%> and type = 2 <%}%> ~~~ **如何使用其它非用户数据,比如我的部门,我的公司,我的店铺....** ~~~ // com.oss.OSSController @Override protected void loginInit(Controller ctrl, User user) throws Exception { super.loginInit(ctrl, user); // 添加自定义业务信息到当前用户中 公司 company = Db.获取我的公司(user.id); if (company != null) { user.put("company", company); // 表达式里调用公司信息 ${user.company.name} } } ~~~ **自定义表达式参数** 语法规则: `表达式主体;自定义参数` ~~~ // 举例: String exp = "select xxx 用户ID, xxx 用户名 from 表名;ds=数据源"; // 获取数据源参数,默认值=main String ds = new EovaExp(exp).getPara("type", "main"); ~~~ EOVA表达式系统参数: ~~~ CNAME("cname", "", "文本字段名"), // V1.6.1 Add 使用场景:订单编码 ROOT("root", "0", "下拉树根节点的值"), // V1.6.0 Add 使用场景:下拉树指定根节点 CACHE("cache", "", "缓存KEY"), DS("ds", "main", "数据源KEY"); private String val;// 参数Key private String def;// 参数默认值 private String txt;// 参数描述 ~~~ 应用场景举例 需求:想在全局拦截器里区分不同类型的表达式,分别执行各自的特殊逻辑 ~~~ // 举例: String exp = "select xxx 用户ID, xxx 用户名 from 表名;type=1"; // 获取类型参数 String type = new EovaExp(exp).getPara("type", "1") if(type == 1){ // 执行逻辑1 } else { // 执行逻辑2 } ~~~