Java Jasper报表中的动态查询
我正在使用Jasper Reports和Java来创建一些报告。在界面中,用户选择1个或多个项目,并为每个项目生成报告。现在,我有一个疑问:Java Jasper报表中的动态查询,java,jasper-reports,Java,Jasper Reports,我正在使用Jasper Reports和Java来创建一些报告。在界面中,用户选择1个或多个项目,并为每个项目生成报告。现在,我有一个疑问: SELECT * FROM StockInventory 这在jrxml文件中。但是,通过我的应用程序运行,它将为表中的每个项目创建一个报告。我想要的是: SELECT * FROM StockInventory WHERE pk IN (?...) 在哪里?。。。是用户选择的项目的键。因此,不仅参数是动态的,而且参数的数量也是动态的 我的问题是,我不
SELECT * FROM StockInventory
这在jrxml文件中。但是,通过我的应用程序运行,它将为表中的每个项目创建一个报告。我想要的是:
SELECT * FROM StockInventory WHERE pk IN (?...)
在哪里?。。。是用户选择的项目的键。因此,不仅参数是动态的,而且参数的数量也是动态的
我的问题是,我不知道如何在jrxml中设置参数,也不知道如何在Java的jasperreports库中设置参数。目前,要设置值,我正在执行以下操作:
Map<String, Object> params = new HashMap<String, Object>();
JasperReport report = JasperCompileManager.compileReport("path\\to\\jrxml");
JasperPrint print = JasperFillManager.fillReport(report, params, new ItemData(keys));
其中ItemData为:
private class ItemData implements JRDataSource
{
private final List<InventoryItem> items;
private int counter;
public ItemData(List<PrimaryKey> keys)
{
items = new ArrayList<InventoryItem>();
InventoryItemDao dao = new InventoryItemDao();
for(PrimaryKey key : keys)
{
InventoryItem item = dao.find(key.getPk(), key.getCpk());
if (item != null)
{
items.add(item);
}
}
counter = -1;
}
@Override
public boolean next() throws JRException
{
if ( counter < items.size() - 1)
{
counter++;
return true;
}
return false;
}
@Override
public Object getFieldValue(JRField jrf) throws JRException
{
// Return the relevant field
}
}
问题是,它在用户选择的主键之间循环,并为每个主键运行一个查询。如果我只需要一个动态查询就可以做到这一点,它会简单得多
谢谢你的帮助 要从Java设置参数,必须将它们放在params对象中 然后在报告中使用它,比如$p{paramName}。当您在报告中声明参数具有相同的名称“paramName”并且其类是您的值对象的类时,请确保 如果要使用IN子句,则必须使用Jasper提供的内置SQL子句函数 格式为$X{IN,}在本例中,请确保只使用参数名,而不使用$p 因此,在您的情况下,查询将是: 从StockInventory中选择*,其中$X{IN,pk,paramName}
“paramName”参数可以是java.util.Collection实例或java.util.List实例。要从java设置参数,必须将它们放在params对象中 然后在报告中使用它,比如$p{paramName}。当您在报告中声明参数具有相同的名称“paramName”并且其类是您的值对象的类时,请确保 如果要使用IN子句,则必须使用Jasper提供的内置SQL子句函数 格式为$X{IN,}在本例中,请确保只使用参数名,而不使用$p 因此,在您的情况下,查询将是: 从StockInventory中选择*,其中$X{IN,pk,paramName}
“paramName”参数可以是java.util.Collection实例或java.util.List实例。如果要动态传递查询,则可能重复,我建议您尝试使用DynamicReports。这是一个基于JasperReports的java库,这里有一个例子:@AlexK这个问题很有用,但除非我遗漏了什么,否则它不会解释如何在java中实际访问和设置这些参数。如果您想动态传递查询,我建议您尝试DynamicReports。这是一个基于JasperReports的java库,这里有一个例子:@AlexK这个问题很有用,但除非我遗漏了什么,否则它没有解释如何在java中实际访问和设置这些参数。所以这就是地图的用途…哈哈。我应该猜到的。我将在实现此功能后向您汇报,并了解其工作原理。谢谢可以这样设置in子句中的值吗?值的数量是不同的,所以我不能只为每个值输入一个参数。这就是地图的用途…哈哈。我应该猜到的。我将在实现此功能后向您汇报,并了解其工作原理。谢谢可以这样设置in子句中的值吗?值的数量不同,所以我不能只为每个值输入一个参数。
Map<String, Object> params = new HashMap<String, Object>();
params.put("paramName",value);
JasperReport report = JasperCompileManager.compileReport("path\\to\\jrxml");
JasperPrint print = JasperFillManager.fillReport(report, params, new ItemData(keys));