sqlTemplate无参时可不可以不要自动补null

2f450ee5-acd5-4f2f-8ac4-317910a1c2cc.png

如上图。使用#para()赋值时,cond中并没有传name。sql中生成了一个问号,jfinal在sqlPara中自动用null补齐了这个参数。导致执行时不报错,返回表中的所有记录(如果sql中用name = #para(name),返回空)。我希望让他报错,我自己再处理异常。请问有哪里可以设置不?

评论区

JFinal

2017-08-12 11:34

扩展一下,先创建一个 MyParaDirective:
public class MyParaDirective extends ParaDirective

在 MyParaDirective 中覆写一下 exec(...) 方法,将原来的 ParaDirective.exec(...) 方法中的代码全 copy过来,改掉下面这一行代码:
sqlPara.addPara(exprList.eval(scope));

上面代码改成:
Object value = exprList.eval(scope);
if (value != null) {
sqlPara.addPara((value);
}

最后配置一下就可以了:
1:arp.getEngine().removeDirective("para") 先移除老的 para 指令
2:arp.getEngine().addDirective("para", new MyParaDirective()) 再添加自己扩展后的指令

sql 管理功能中的三个指令本身也全是扩展而来的,大家可以用类似的办法自由定制自己需要的指令

记得搞后来回来分享一下

i++

2017-08-12 11:36

我觉得jfinal在赋值sqlPara时,发现sql语句是的?没有对应的参数时,应该按正常的业务思维逻辑抛出参数缺失的异常,因为是通用接口,所以我不好在接口中对参数进行校验。也不能在sqltemplate中写#if()判断。@jfinal

JFinal

2017-08-12 11:36

要特别注意:经过上面的改进以后,如果某个参数值为 null,那么所报的异常为参数个数不对,对于不知道有此扩展的背景的开发者可能会被搞糊涂,以为自己少传了参数,这也是 jfinal 为啥不直接支持的原因之一

还有一个原因是字段值是可以设置为 null 值的,所以在有些场景下 null 本身是正确的值

i++

2017-08-12 16:49

@JFinal 按你说的改了。但是我不是用value做判断,而是去判断有没有参传。所以参会值还是可以传null的,不会有你说的那两个问题。代码如下
if (index == -1) {
Expr[] exprArray = exprList.getExprArray();
Object ret = null;
for (Expr expr : exprArray) {
boolean hasPara = scope.getData().containsKey(expr.toString());
if (hasPara) {
ret = expr.eval(scope);
} else {//没有传参数抛异常
throw new TemplateException(
"The parameter '"+expr.toString()+"' must be assigned",
location);
}
}
sqlPara.addPara(ret);
// sqlPara.addPara(exprList.eval(scope));
}

有没有传参和传的是不是null值是两码事

JFinal

2017-08-12 17:17

@i++ 这个改进很不错,下个版本添加这个功能,感谢你的贡献 ^_^

热门反馈

扫码入社