模板引擎种for指令对参数的排序问题

参照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的源码,没有发现有排序处理的地方。







评论区

azzcsimp

2018-07-17 18:46

for指令会对Kv内封装的内容进行排序处理吗?

JFinal

2018-07-17 18:56

@azzcsimp for 指令内部没有做排序处理,多尝试些数据肯定能试出来数据量小体现不出来

azzcsimp

2018-07-17 18:59

@JFinal 好的,那我对这块判断逻辑再处理下。