【问题标题】:Dynamic Query in Jasper ReportJasper 报表中的动态查询
【发布时间】:2014-04-23 15:49:32
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

  • 如果您想动态传递查询,我建议您尝试 DynamicReports。它是一个基于 JasperReports 的 java 库,这里有一个例子:mkyong.com/java/…
  • @AlexK 这个问题很有用,但除非我遗漏了什么,否则它不会解释如何在 Java 中实际访问和设置这些参数。

标签: java jasper-reports


【解决方案1】:

要从 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, &lt;column_name&gt;, &lt;parameter_name&gt;}(确保使用,在这种情况下,只使用参数名称,不带$P)。

因此,在您的情况下,查询将是:

SELECT * FROM StockInventory WHERE $X{IN,pk,paramName}

'paramName' 参数可以是 java.util.Collection 实例或 java.util.List 实例。

【讨论】:

  • 这就是地图的用途……哈哈。我应该猜到的。我会在我实现这个后报告,看看它是如何工作的。谢谢!是否可以以这种方式在 IN 子句中设置值?值的数量各不相同,所以我不能只为每个值输入一个参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多