我试图将逗号分隔的字符串值作为参数传递给birt报告,但失败了
java代码
String userlist="\"a\",\"b\",\"c\"";
task.setParameterValue("userlist", userlist);
在开放之前
params["userlist"].value.join("','");
sql查询为
select * from users where name in (?)
我已经将数据集参数链接到报表参数param\u 1它总是给我空报表,即使db table有3个用户。有什么建议吗?
1条答案
按热度按时间xxe27gdn1#
了解你的工具!在本文中:您必须理解sql和绑定变量、javascript和birt的概念。不幸的是,你发布的每一段代码都是错误的(或者至少是不完整的)。
但您的做法是正确的:可以在数据库的beforeopen事件中修改sql文本。我将在这里简述这个想法:
在sql中,替换?使用类似于“in list”的占位符(以便它是有效的sql)。
您仍然应该在sql中使用bind变量(以避免birt的缓存机制造成的陷阱),但是要以一种有效的no-op方式,例如“where?不为空”。
在数据集的beforeopen事件中,可以修改sql文本:
获取原始sql文本(var query=this.querytext;iirc)。
将报表参数拆分为各个搜索项。具体怎么做取决于你的输入格式。在您的示例中,您使用
"
在搜索词周围,这看起来过于复杂,除非单个搜索词可能包含逗号。您现在应该有一个搜索字符串列表,例如。["a", "b", "c"]
.将每个术语转换为有效的sql字符串文字。小心sql注入攻击,所以小心地转义单引号之类的字符!现在应该有一个有效的sql字符串文本列表,例如。
["'a"', "'b'", "'c'"]
.用“,”将3)中的sql字符串文本列表合并为一个字符串。你现在应该有一个像
'a', 'b', 'c'
.在查询中,将占位符字符串替换为(4)中的字符串。
将修改后的sql文本写回ds对象:
this.queryText = query;
也许在互联网的迷雾中也有一个例子。如果您再投入五分钟,您应该已经在这里找到了关于堆栈溢出的现有答案:如何创建一个birt数据集,该数据集接受多个(csv)值,可以在select语句的“in”子句中使用,唯一的区别是您正在搜索字符串列表,而这个问题是关于数字列表的。