无法将逗号分隔的值传递给birt报告

5lhxktic  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(330)

我试图将逗号分隔的字符串值作为参数传递给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个用户。有什么建议吗?

xxe27gdn

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”子句中使用,唯一的区别是您正在搜索字符串列表,而这个问题是关于数字列表的。

相关问题