jfinal sql 模板动态传参

我sql模板代码

#sql("getStockLogList")
 select * from `catchmall`.`stock_log` o
    where 1 = 1

    #if(kssj??)
        and o.create_date >= #para(kssj)
    #end

    #if(jssj??)
        and o.create_date <= #para(jssj)
    #end

    #if(sort??)
        order by #para(sort) #para(order)
    #end
#end

一个简单的拼接where,后台传过来参数如果有条件则拼接,没有就做拼接

protected Page<M> getModelPages(String sqltpl, Integer page, Integer rows, Kv params) {
   SqlPara sqlPara = Db.getSqlPara(sqltpl, params);
   Page<M> pr = baseDao.getDao().paginate(page, rows, sqlPara);
   return pr;
}

params的可选条件参数,比如上面的开始时间,结束时间和排序字段以及排序倒叙顺序,可选0~多个条件

当我对时间做排序的时候传过来的参数是这样的

blob.png

最后后台报错

blob.png

说参数越界,不知道哪里出的问题

评论区

JFinal

2017-09-03 18:15

你的 sort 是 create_date, order 是 asc,这两个东东明显是不能使用问号占位符的,将 #para 指令改成输出指令即可:
#if(sort??)
order by #(sort) #(order)
#end

JFinal

2017-09-03 18:18

此外,永远不要对一个变量用 ?? 运算符,上面的代码直接这样就好:
#if ( sort ), 因为对于一个变量来说,不可能出现取值时的空指异常

只有在多层次取值,或者方法调用时才需要使用 ?? 运算符,象下面就需要:
#if (obj.value ?? ) ,因为 obj 为 null 时会抛出异常

还有一个应用场景是变量为 null 并且需要默认值时,例如:
value ?? defaultValue

yjjdick1990

2017-09-04 20:57

这个问题我已经解决了,而且反省了一下自己对输出指令和问号占位符概念的问题,现在对这块已经明白了,不会犯这样的错误了,谢谢波总指导

HeathClieff

2018-03-07 12:50

请问:
我们知道#para(1)是可以输出sql参数的,但是不知道如何判断sql参数是否为空
比如我这样写if(null==#para(1))是报错的
怎么办呢?

JFinal

2018-03-07 14:13

@HeathClieff 注意看文档的第三小节: http://www.jfinal.com/doc/5-13

加餐:有些同学希望在 sql 文件中获取getSqlPara(String, Object… paras) 方法传入的paras参数,可以通过表达式 _PARA_ARRAY_[index] 来获取到下标为index的参数值

具体到你的应用:
if(null == _PARA_ARRAY_[index])

你好啊世界

2019-10-10 12:55

太好了,_PARA_ARRAY_[index] 可以在#if 里面判断参数动态生成SQL 。

热门反馈

扫码入社