SQL 管理与动态生成--如何同时传入多个条件

应用场景(不知道该如何处理):

一个动态sql,除了传入一个Kv的参数外,还想传入别的别的独立参数,去组装sql。

由于Kv.set(key,value)都是键值对,我的sql了需要一个函数条件,没办法放到Kv里传参,如下:

//函数条件
where regexp_like(SERVICE_OBJECT,'1|个人')
//service层方法如下:
SqlPara sqlPara = Db.use("oracle").getSqlPara("profolder.paginate",Kv.by("cond",cond));
Page<Record> proFolderList = Db.use("oracle").paginate(pageNumber,10,sqlPara);

评论区

轩恒

2018-08-23 09:28

找到解决办法:(进一步了解了sql脚本的用法)

参数如下:
Kv cond = Kv.by("1 = ", 1);
if(Project.SEARCH_BY_PERSON.equals(classType)){
cond.set("personKey"," regexp_like(SERVICE_OBJECT,'1')");
}
if(Project.SEARCH_BY_CORPORATION.equals(classType)){
cond.set("companyKey"," regexp_like(SERVICE_OBJECT,'2')");
}
if(!"0".equals(searchOrg)){
cond.set("ORG_CODE = ",searchOrg);
}

sql脚本如下:
#for(x : cond)
#if(x.key == 'personKey' || x.key == 'companyKey')
#(for.first ? "where": "and") #(x.value)
#else
#(for.first ? "where": "and") #(x.key) #para(x.value)
#end
#end

JFinal

2018-08-23 10:31

使用 Kv 或者 Map 可以传入任意数量的参数,例如:
Kv cond = Kv.by("1 = ", 1);
cond.set("其它参数", "其它值");

Kv other = Kv.by("key", "value");
// 这里是 Kv 中再包含另一个 kv,可以在模板中通过 #(other.key) 来访问
cond.set("other", other);

JFinal

2018-08-23 10:32

总之,直接传给 getSqlPara 的那个 Kv 是最底层的 Map, 可以在这个底层的 Map 参之内再传入其它任意类型的参数进去,从传参的角度来说是没有任何限制的

轩恒

2018-08-23 11:24

@JFinal 嗯,理解了。

ddjfinal

2018-09-06 17:11

这个简单啊,特殊的放在另外一个Kv里面去,
#for(o : cond)
AND #(o.key) = #para(o.value)
#end
#for(x : map)
#if(" "==x.value)
#(x.key)
#else
#(x.key) #para(x.value)
#end
#end

ddjfinal

2018-09-06 17:13

@ddjfinal 这样写,你的 >= ,!=这些运算符都能直接写在key里面了。

ddjfinal

2018-09-06 17:14

@ddjfinal 类似 Kv.by("cond", cond).set("map",map);

轩恒

2018-09-07 15:17

@ddjfinal 嗯后来理解了,才明白很灵活的可以实现。

热门反馈

扫码入社