动态sql sqlPara 如果有in 参数 如 1,2,3 被截取

Controller代码:

public void list(){
	Record record = new Record();
	record.set("oper_type", get("oper_type"));
	renderJson(service.getGrid(getParaToInt("pageNumber",1), getParaToInt("pageSize",10),record));
}

service 代码:
public Grid getGrid(int pageNumber,int pageSize,Record record){
	SqlPara sqlPara=Db.getSqlPara("core.getSysLogs",record);
	Page<Record> page=getDbPro().paginate(pageNumber, pageSize, sqlPara);
	return new Grid(page.getList(), pageNumber, pageSize, page.getTotalRow());
}

sql 代码:
#sql("getSysLogs")
	select * from sys_log s where 1=1
	
	#if(oper_type)
		and s.oper_type in (#para(oper_type))
	#end

	order by oper_time desc
#end


如前台获取到的参数为0,1,2 这样 只能获取第一个 也就是0  但是跟踪代码 sqlPara.getPara() 获取到的是[0,1,2] 不知都是不是自动根据,拆分了,因为只有一个参数所以只取第一个

数据库为musql

评论区

JFinal

2019-10-25 15:29

修改一下贴子,将 sql 也补充进去, java 代码也补充完整

当前信息量不知道问题是什么

yunqi

2019-10-27 12:42

代码已经贴了

JFinal

2019-10-27 16:32

@yunqi JDBC 要求 sql 语句 in 子句中问号的数量与参数个数相同,有几个参数就需要几个问号

回到你的下面这行代码:
and s.oper_type in (#para(oper_type))
如果 oper_type 值为 0, 1, 2 那么生成的 String sql 与 Object[] paras 值如下:
1:生成的 sql 片段:and s.oper_type in ( ? )
2:#para (oper_type) 对应的参数:0, 1, 2

也就是说,你的 sql in 中就一个问号,但参数却有三个,必然出错,这个错误不是 jfinal 干预的,而是 JDBC 的规则

具体的解决办法,需要改正 sql 模板的写法:

sql 代码:
#sql("getSysLogs")
select * from sys_log s where 1=1

#if (oper_type)
and s.oper_type in (
#for ( x : oper_type.split(","))
#para(x) #if(!for.last) , #end
#end
)
#end

order by oper_time desc
#end

如上所示,通过将参数按逗号分隔出来,然后在 in 内部使用 for 循环生成问号,使得参数个数与问号个数相等

yunqi

2019-10-27 17:15

哦,好的,谢谢!

热门反馈

扫码入社