Jasper报告中的动态查询

时间:2014-04-21 19:53:38

标签: java jasper-reports

我正在使用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
    }
}

这个问题在于它循环遍历用户选择的主键并为每个主键运行查询。如果我可以使用单个动态查询来执行此操作,则会更加简单。

感谢您的帮助!

1 个答案:

答案 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实例。