普通查询
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等对象的使用将在高级查询的篇章中进行说明