全栈低码设计开源框架 json-script-rule 查询功能说明

普通查询

get插件中的参数说明

condition

  • matches:别名where,表示查询的具体条件
  • type:表示多个条件之间的并和或关系,只允许and值或or值,默认为and

matches说明

所有的匹配条件属性均是有序的

  • eq:表示等于(equal),代表"="符号
  • ne:表示不等于(not equal),代表"!="符号
  • in:表示in关键字,例如name in ('qqq','xxx')
  • ni:表示not in
  • li:表示like,可以手动将%符号加在前面或是后面
  • nl:表示not like
  • gt:表示大于,gt对应的字段值应该是最小的
  • ge:表示大于等于
  • lt:表示小于,lt对应的字段值应该是最大的
  • le:表示小于等于
  • to:用于子查询,视图等,例如in (select ......)
  • br:bracket,用于处理条件之间并和或关系的转换

bracket说明

当and与or并行存在时会发生歧义,如A and B or C,它可以是(A and B) or C,或者A and (B or C),为了支持这种sql场景的存在,这里可以使用bracket进行反转,bracket里面的条件之间的与或逻辑应该是相同的,而其外面的条件之间的与或逻辑应该全部是刚好相反的,以此类推,通过这种方式可以有效解决复杂条件之间的与或逻辑

relation

关联关系对象,单表或多表联查时均需要此对象,它表示表和表之间的关联关系,其中包含了如下3个属性

  • classes:对应java类的名称,它是一个数组,允许查询多个表
  • joins:表示此次查询采用join方式进行关联,是一个join对象数组,数组中每一个join对象表示一个要加入join查询的表,值得注意的是当该属性存在时,classes属性数组中理应只有1个class对象表示主表,如A left join B,A即是主表
    join:该对象里的class属性表示待加入外连接查询的子表。type属性的值仅可为inner、left、right,表示A和B之间采用的是inner join、left join还是right join进行外连接查询,默认为left。conditions属性表示A和B之间的关联条件,例如left join on ......,如果该属性不存在,则默认A和B之间采用实体类中配置的主外键进行关联
  • condition:该属性为relation对象中的属性而非join对象中的属性,如果该属性为空则默认为实体类中配置的主外键进行关联,如果存在则以该对象作为关联条件对表进行关联,它等同于where后面的条件语句,它与joins属性中的condition属性不发生冲突,joins中的condition表示on,而relation中的condition则表示where,具体的关系可参考edi.rule.model.JSRuleRelations对象
    注意:relation对象中的condition仅表示表和表之间的关联条件,它与get插件中的condition不发生冲突,get插件中的condition属性可以替代relation对象中的condition属性

union

对应数据库关键字union,它在get插件中是一个数组,表示可以union多个查询结果

  • type:分为union和all两个属性,前者表示union,后者表示union all,默认为all属性
  • pointer:表示一个点,这个点既可以是一个表,也可以是一个子查询,还可以是一个动态视图,总而言之它表示一个查询结果,在这里它表示的是所要union的一个查询结果,即A union B
    注意:oracle数据库在使用union的时候如A union all B,如果A或B的结尾处有排序order语法,数据库便会抛出缺失右括号的bug

pointer

该属性表示一个查询结果集

  • class:表示该结果集是一张表,对应的值为实体类的名字
  • action:表示该结果集是一个sql语句,是在它前面执行过的action解析后的一个sql,该属性对应的是action的名字
  • view:表示该结果集是一个视图,对应的值为视图的名字,即JSRuleTable注解中的name的值

profile对象

该属性用于一对多或多对一的查询,它有些类似mybatis的collection标签,通过它可以描述所查询的多个表之间的主子关系,其主子关系可以反转

  • cClass:主表的类名,别名c,不可以为空
  • mClasses:当前主表对应的子表的集合,别名m,为空时表示当前表在层级结构中为叶子结点

get中的其它属性

  • fields:表示所要查询的字段,此参数为空时表示查询所有字段,如果一次请求中两个类含有相同的字段名,则需要加上类的前缀名加以区分
  • group:分组对象,其中包含having和by两个属性,有序
  • order:排序对象,包含排序字段以及排序方式(asc和desc),有序
  • convertSql:是否根据json脚本来生成sql语句,默认是启用的,当你不需要系统来解析json脚本并生成sql语句时可将改属性设置为false
  • execute:根据请求json生成的sql语句是否执行,默认为true,为false时将返回生成的sql语句,该属性通常用于子查询等不需要执行sql语句的场景
  • page:分页对象,其属性有pageSize,dataSize(当前页数据数量),pageNum,totalPage,totalCount
  • groupShow:是否以分组的形式进行显示,默认为false,通常用于多表查询时区分字段属于哪个表

用例1

{
    "actions": [
        {
            "name": "test_relation2",
            "get": {
                "relation": {
                    "classes":["bao.ZsTestMinor","ZsTestPO","ZsTestMinorSon"],
                    "condition":{
                        "type":"and",
                        "where":{
                            "eq":{"ZsTestPO.id":["#&bao.ZsTestMinor.zs_test_id"],"bao.ZsTestMinor.id":["#& ZsTestMinorSon.zs_test_minor_id"]}
                        }
                    }
                },
                "page":{"pageNum":1,"pageSize":4},
                "profile":{
                    "c":"ZsTestPO",
                    "m":[{
                        "c":"bao.ZsTestMinor",
                        "m":[{
                            "c":"ZsTestMinorSon"
                        }]
                    }]
                },
                "fields":["ZsTestMinorSon.id","ZsTestPO.id","bao.ZsTestMinor.id","bao.ZsTestMinor.zs_test_id","ZsTestPO.name"]
            }
        }
    ]
}

注意:使用profile对象时,fields属性中必须要包含带前缀的类的主键字段

用例2

{
    "actions": [
        {
            "name": "test_relation",
            "define":{"viewParams":{"view.ZsTestView":["son1_1","%1%"]}},
            "get": {
                "relation": {
                    "classes":["ZsTestPO"],
                    "joins":[{
                        "class":"view.ZsTestView",
                        "type":"left",
                        "condition":{"where":{"eq":{"ZsTestPO.id":["#&view.ZsTestView.zs_test_id"]}}}
                    }]
                },
                "condition":{
                    "where":{
                        "eq":{"ZsTestPO.name":["ccc"]},
                        "gt":{"birthDay":"2021-02-02"}
                    }
                },
                "groupShow":true,
                "page":{"pageSize":0},
                "fields": ["#$sysdate()@asd","currentDate","view.ZsTestView.test_field","ZsTestPO.test_field","birthDay","create_date","ZsTestPO.id"]
            }
        }
    ]
}

后台生成出来的sql,如下

select sysdate() as "asd" ,current_date as "current_date" ,suibian.test_field as "view_ZsTestView-test_field" ,zs_test.test_field as "ZsTestPO-sum_test_field" ,birth_day as "birthDay" ,create_date as "create_date" ,zs_test.id as "ZsTestPO-id"  from  zs_test  left join  (select * from zs_test_son1 where oh_no='son1_1' and id like '%1%') suibian on zs_test.id=suibian.zs_test_id where zs_test.name='ccc' and birth_day>'2021-02-02'

提示:关于union,pointer等对象的使用将在高级查询的篇章中进行说明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容