参照SQL模板的动态生成如下:
#sql("find") select * from girl #for(x : cond) #(for.first ? "where": "and") #(x.key) #para(x.value) #end #end
Kv cond = Kv.by("age > ", 16).set("sex = ", "femal"); SqlPara sp = Db.getSqlPara("find", Kv.by("cond", cond)); Db.find(sp);
当前端传递age为空的时候生成语句
select * from girl where age > '' and sex = 'femal'
--------------------------------------------------------------------
想要达到的目的,当筛选参数值为空时不拼接条件,改造如下
#sql("find") select * from girl #for(x : cond) #if(x.value??) #(for.first ? "where": "and") #(x.key) #para(x.value) #end #end #end
测试结果当age为空并且sex为空时动态生成语句
select * from girl
当age非空,sex为空时动态生成语句
select * from girl where age > 16
我尝试了前端通过Kv封装传递名称为a、b、c的参数,任意给一个参数赋值,
通过for指令对参数循环,进入循环的第一次必定是有值的参数。
也就是说#(for.first)判断生成where或and完全不会出错。
而使用HashMap则不是这样,翻阅了下Kv的源码,没有发现有排序处理的地方。
项目:JFinal