我正在使用Jasper Reports with Java来创建一些报告。在界面中,用户选择一个或多个项目,并为每个项目生成报告。现在,我有了查询:
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
}
}
这个问题在于它循环遍历用户选择的主键并为每个主键运行查询。如果我可以使用单个动态查询来执行此操作,则会更加简单。
感谢您的帮助!
答案 0 :(得分:4)
要从Java设置参数,您必须将它们放在params
对象中。
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));
然后在报告中使用它,如$ P {paramName}。当您在报告中声明参数具有相同的名称('paramName')并且其类是您的value
对象的类时,请确保。
如果要使用IN子句,则必须使用Jasper提供的内置SQL子句函数。
格式为$X{IN, <column_name>, <parameter_name>}
(在这种情况下,请确保使用参数的名称,不带$ P)。
因此,在您的情况下,查询将是:
SELECT * FROM StockInventory WHERE $ X {IN,pk,paramName}
'paramName'参数可以是java.util.Collection实例,也可以是java.util.List实例。