Java Jasper报表中的动态查询

Java Jasper报表中的动态查询,java,jasper-reports,Java,Jasper Reports,我正在使用Jasper Reports和Java来创建一些报告。在界面中,用户选择1个或多个项目,并为每个项目生成报告。现在,我有一个疑问: SELECT * FROM StockInventory 这在jrxml文件中。但是,通过我的应用程序运行,它将为表中的每个项目创建一个报告。我想要的是: SELECT * FROM StockInventory WHERE pk IN (?...) 在哪里?。。。是用户选择的项目的键。因此,不仅参数是动态的,而且参数的数量也是动态的 我的问题是,我不

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

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));