首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
Jfinal 如何实现IN查询呢????
arboret
2017-09-14 18:44
最终拼接的sql如下,不对啊
我拼接的参数如下,括号后是没有'?'的
但最后它生成的sql确是这个样子, 括号后多了个'?'
到底要怎样才能实现in查询啊?~~~
@JFinal
项目:
JFinal
2
评论区
JFinal
2017-09-14 19:59
sql 与参数弄对就可以了,贴子中的 sql 明显是错误的: and orgId in(?)?
正确的应该是: xxx in (?, ?, ?.... ?) 有多少个参数就有多少个问号,然后参数也要对号入座,参数个数也要完全相同
回复
arboret
2017-09-15 09:15
@JFinal
括号外的问号不是我拼接的data.put("orgId in(" + inBuf.toString() + ")", info.get("orgList") ); 我在括号外没有拼接'?',是getSqlPara后它生成的
回复
JFinal
2017-09-15 09:18
@arboret
那么,解决办法不用多说了吧?
回复
arboret
2017-09-15 09:26
@JFinal
额,没太明白。帖子内我增加了两张图片说明
回复
arboret
2017-09-15 09:34
@JFinal
SqlPara似乎会自动把map里的key在最后追加一个'?'
回复
arboret
2017-09-15 10:00
@JFinal
我把扩号后面的?替换掉后现在能执行不报错了,但查不出数据,代码如下:
if(sqlPara.getSql().contains(")?") ) sqlPara.setSql(sqlPara.getSql().replace(")?", ")") );
最终的sql如下:
select count(*) from t_law_info
where isDelete = ? and orgId in(?)
sql我拿到数据库里执行了没问题可以查出数据, 但在项目中执行却查不出数据,请问是什么原因呢
回复
arboret
2017-09-15 10:12
结贴了, 问题已经解决了。总结下这次的问题及解决方案:
使用SqlPara做in查询需要将in括号中的sql做拼接, 参数不能直接使用list需要将list中的元素以逗号分隔的形式拼接起来作为字符串参数,由于SqlPara会对map中的key的末尾追加一个'?',所以在getSqlPara后需要对SqlPara中的sql做判断是否包含 ")?" 并将其替换为")" ,至此才能正确执行in查询。
@JFinal
回复
JFinal
2017-09-15 10:20
@arboret
很明显问题出在 sql 模板中的使用,但至始至终你都不出示这段代码。
永远记住:生成 "?" 问号占位的是 #para(...) 指令,而不可能与 "map中的 key" 有任何关系
目前你的解决办法很不优雅,只是在生成了错误的 sql 以后,再用 replace 再补救,与真正正确的道路相差甚远
你的 java 代码中用了很多 if 判断,显然这些判断在 sql 模板中去做会更优雅
总之:一定要先会用 jfinal 模板引擎的基本用法,然后再用好 #para,就可以解决问题
回复
arboret
2017-09-15 10:25
@JFinal
我也是觉得我现在的解决办法很不好。。但要如何正确的解决我也不太清楚, 有什么解决教程吗以及在*.sql中jfinal有哪些语句是可以使用的呢
回复
JFinal
2017-09-15 10:52
@arboret
jfinal 手册里面全都有, sql 管理功能用的 jfinal 模板引擎,那么模板引擎中的所有功能可以直接用于 sql 模板之中,例如你的这个 sql,用下面的结构,立即避免掉了java 代码中的 if 判断:
#for(x : cond)
#if(x.key)
#(x.key) #para(x.value)
#end
#end
以上通过一个 #if(x.key) 直接避免掉你在 java 代码中的五个 if 判断,此外,生成sql 语句的 IN(...) 这块代码,也完全可以放在模板文件之中,而 java 代码只需要准备好参数就好
生成 sql 的事情天然就该交给模板引擎来做,你现在的用法是 java 代码中做一部分,模板中做一部分,还不如直接在 java 中做完
回复
arboret
2017-09-15 11:17
@JFinal
学习了,谢谢~
回复
casey123
2019-05-08 16:47
@JFinal
in(#para(0)),我参数传的“2,3”,getSqlParam最终生成的语句in('2,3')...有没有什么办法变成in(2,3),你说的几个问号对应几个#param我这边业务场景不适用,因为in里面具体有几个我事先并不确定
回复
casey123
2019-05-08 16:53
@JFinal
大佬,我使用的sql管理,是不是sql管理里面暂时不支持动态的in查询,只能在代码里面拼?目前项目中好多sql的动态in查询我都交给sql管理了,能在继续使用sql管理的基础上改吗。。。项目很急,麻烦大佬有空解答一下,谢谢
回复
casey123
2019-05-08 17:18
@JFinal
找到了,谢谢。。
回复
糊搞
2020-05-23 18:10
@casey123
https://my.oschina.net/u/1175852/blog/4288502
回复
发送
我要反馈
热门反馈
扫码入社
正确的应该是: xxx in (?, ?, ?.... ?) 有多少个参数就有多少个问号,然后参数也要对号入座,参数个数也要完全相同