Jfinal 如何实现IN查询呢????

d1.png

最终拼接的sql如下,不对啊image.png

image.png

我拼接的参数如下,括号后是没有'?'的

image.png

但最后它生成的sql确是这个样子, 括号后多了个'?'

image.png

到底要怎样才能实现in查询啊?~~~

@JFinal

评论区

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