ConfigStore与json相互转换
最后更新:2025-07-24 11:08:52
|
状态:未完成
在低代码等自定义查询条件的解析过程比较麻烦,可以按ConfigStore约定的格式提交一个JSON实现ConfigStore的自动解析
同时ConfigStore也可以逆向生成JSON格式用来保存或传输。【ConfigStore转SQL】
json格式参数ConfigStore.json()方法输出的格式
ConfigStore > JSON,JSON格式比较麻烦,需要什么条件可以先用ConfigStore逆向生成一下看看
ConfigStore configs = ConfigBuilder.build(json);
ServiceProxy.query(表, configs)
如果是多表关联,参考【多表关联约定】
简化格式
items[]表示多个查询条件,一个条件就是一个{key,value},多个条件才需要JOIN,如果不写JOIN默认AND 如果有两个条件就是items[{k1,v2},{k2,v2}]
如果遇到带()的多层条件一个()相当于一个items[],如(k1=v1 AND (k2=v2 OR k3=v3)这里的后两个条件就放到一个items中 items[{k1,v1},{items:[{k2,v2},{k3,v3}]}]
同时ConfigStore也可以逆向生成JSON格式用来保存或传输。【ConfigStore转SQL】
json格式参数ConfigStore.json()方法输出的格式
ConfigStore > JSON,JSON格式比较麻烦,需要什么条件可以先用ConfigStore逆向生成一下看看
ConfigStore configs = new DefaultConfigStore();
configs.and("ID", 1);
configs.like("NAME", "ZH");
configs.in("TYPE_CODE", "1,2,3".split(","));
ConfigStore ors = new DefaultConfigStore();
ors.and("A", 1);
ors.or("B", 2);
configs.or(ors);
configs.group("TYPE_CODE").group("CLASS_CODE");
configs.having("MIN(PRICE)>100").having("COUNT(*)>1");
//如果having条件比较复杂可以通过ConfigStore构造
ConfigStore having = new DefaultConfigStore();
having.and("MAX(ID)>0").or("MIN(ID)>0").and(Compare.GREAT, "COUNT(*)", 1);
configs.having(having);
String json = configs.json(true);
JSON > ConfigStore ConfigStore configs = ConfigBuilder.build(json);
ServiceProxy.query(表, configs)
如果是多表关联,参考【多表关联约定】
注意两个类Config和ConfigChain
Config:查询条件,对下面json里的一个{}
ConfigChain:继承自Config是多个条件的集合,集合中的条目有可能是Config也有可能还是个ConfigChain,可以理解成一个()里有多个条件,也对应下面json里的一个items[]
join:表示前一个条件与当前条件的join方式(and或or)
下面的JSON是通过ConfigStore.json()逆向生成的,所以会有许多附加属性,最后有简化格式。
{
"columns": {
"query": [
//需要查询列,如果未提供则查询
],
"exclude": [
//不需要查询的列,有些情况显要返回给前端的列非常多,但只有很少几个不需要返回如密码,
//通过query一个一个指定太啰嗦,可以通过exclude指定表示 查除了exclude之外的所有列
]
},
"navi":{ //分页(更多默认设置参考PageNaviConfig)
"page":1, //当前第page页 默认1
"vol":10 //每页vol行 默认PageNaviConfig.DEFAULT_VAR_PAGE_DEFAULT_VOL
}
"havings":["MIN(PRICE)>100","COUNT(*)>1"],
"havings":[{"text":"MIN(PRICE)>100"}]//自动生成的会比较复杂效果一样
"havings":[] //与conditions.items格式一致
"groups":["TYPE_CODE", "CLASS_CODE"],
"groups":[{column:"TYPE_CODE", column:"CLASS_CODE"}]//自动生成的会比较复杂效果一样
"conditions": { //ConfigStore中查询条件的最外层对应属性ConfigChain 简化方式可以直接写String查询条件或[String | json]数组(见最后示例)
"join": "AND", //这里有JOIN方式,是因为有可能会有多个ConfigStore,前一个ConfigStore与当前ConigStore以and方式join
"items": [ //ConfigChain中的集合,相当于SQL条件中的()中的多个and或or
{ //集合中的条目有可能还是一个集合,相当于多层嵌套
"join": "AND",
"items": [
{
"join": "AND",
"text": null, //表示一个静态条件,没有参数或者其他比较复杂的条件 如 USER_ID IS NULL
"key": null, //表示http参数名在AnylineController.condition("USER_ID:usr")形式中用到的key=usr
"var": "ID", //列名或自定义SQL的查询条件ID
"compare": 10, //比较运算符,参考org.anyline.entity.Compare枚举,默认10(equal)
"values": [1], //值对于IN BETWEEN会有多个值
"over_condition": false, //覆盖相同var查询条件
"over_value": true, //相同查询条件第二次赋值是否覆盖上一次的值,如果不覆盖则追加到values集合中
"parser": { //比较复杂的条件需要更多参数
"prefix": null, //自定义SQL中的查询条件可能有多个占位符,赋值时需要prefix.var:key格式(查询条件id.占位符:http参数)
"var": "ID", //与外层var作用重复,只需要指定一个即可
"class": null, //参数值有可能需要预处理var:class.method(key)
"method": null,
"key": null, //与外层key作用重复,只需要指定一个即可
"default": [], //通过key没取到会值时的默认值
"compare": 10, //与外层compare用重复,只需要指定一个即可
"join": "AND" //与外层join作用重复,只需要指定一个即可
}
},
{
"join": "AND",
"text": null,
"key": null,
"var": "NAME",
"compare": 50,
"values": ["ZH"],
"over_condition": false,
"over_value": true,
"parser": {
"prefix": null,
"var": "NAME",
"class": null,
"method": null,
"key": null,
"default": [],
"compare": 50,
"join": "AND"
}
},
{
"join": "AND",
"text": null,
"key": null,
"var": "TYPE_CODE",
"compare": 40,
"values": ["1","2","3"],
"over_condition": false,
"over_value": true,
"parser": {
"prefix": null,
"var": "TYPE_CODE",
"class": null,
"method": null,
"key": null,
"default": [],
"compare": 40,
"join": "AND"
}
}
]
},
{
"join": "OR",
"items": [
{
"join": "AND",
"items": [
{
"join": "AND",
"text": null,
"key": null,
"var": "A",
"compare": 10,
"values": [1],
"over_condition": false,
"over_value": true,
"parser": {
"prefix": null,
"var": "A",
"class": null,
"method": null,
"key": null,
"default": [],
"compare": 10,
"join": "AND"
}
},
{
"join": "OR",
"text": null,
"key": null,
"var": "B",
"compare": 10,
"values": null,
"over_condition": false,
"over_value": true,
"parser": {
"prefix": null,
"var": "B",
"class": null,
"method": null,
"key": null,
"default": [],
"compare": 10,
"join": "OR"
}
}
]
}
]
}
]
}
}
简化格式
conditions:{"ID=1"}
conditions:["ID=1", "CODE=2"]
conditions:[{}] //与上面的items条目格式一样
items[]表示多个查询条件,一个条件就是一个{key,value},多个条件才需要JOIN,如果不写JOIN默认AND 如果有两个条件就是items[{k1,v2},{k2,v2}]
如果遇到带()的多层条件一个()相当于一个items[],如(k1=v1 AND (k2=v2 OR k3=v3)这里的后两个条件就放到一个items中 items[{k1,v1},{items:[{k2,v2},{k3,v3}]}]