Jasper 报告中的动态查询

Tro*_*oso 1 java jasper-reports

我正在使用 Jasper Reports 和 Java 创建一些报告。在界面中,用户选择1个或多个项目,并为每个项目生成报告。现在,我有查询:

SELECT * FROM StockInventory
Run Code Online (Sandbox Code Playgroud)

这是在 jrxml 文件中。但是,通过我的应用程序运行它,它会为表中的每个项目创建一个报告。我想要的是:

SELECT * FROM StockInventory WHERE pk IN (?...)
Run Code Online (Sandbox Code Playgroud)

其中“?...”是用户选择的项目的键。因此,不仅参数是动态的,而且参数的数量也是动态的。

我的问题是,我不知道如何在 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));
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是它会遍历用户选择的主键并为每个主键运行查询。如果我可以只用一个动态查询来做到这一点,那就简单多了。

谢谢你的帮助!

Lau*_*ura 5

要从 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));
Run Code Online (Sandbox Code Playgroud)

然后在报告中使用它,如 $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 实例。