如何使用JavaBeans作为数据源显示嵌套对象?

时间:2016-05-02 16:19:40

标签: java jasper-reports javabeans

这是我的java对象:

Class1.java:

public class Class1 {
    public Class2 object2;
    ...
}

Class2.java:

public class Class2 {
    public Class3 object3;
    ...
}

Class3.java:

public class Class3 {
    public List<Class4> list4;
    ...
}

Class4.java:

public class Class4 {
    public String string1;
    public String string2;
    public String string3;

    public Class5 object5;
    ...
}

我有一个包含子报表的报告,并且两者都使用相同的数据源,如下所示:

public static void execute(List<Class1> data) throws FileNotFoundException, JRException {

BufferedInputStream reportStream = new BufferedInputStream(new FileInputStream("C:/Users/user1/Downloads/report2.jrxml"));

// Bing the datasource with the collection
JRDataSource datasource = new JRBeanCollectionDataSource(data, false);

Map<String, Object> parameters = new HashMap<String, Object>();

parameters.put("SUBREPORT_DIR", "C:\\Users\\user1\\Downloads\\");

parameters.put("SUB_DATA_SOURCE", data);

// Compile and print the jasper report
JasperReport report = JasperCompileManager.compileReport(reportStream);
JasperPrint print = JasperFillManager.fillReport(report, parameters, datasource);

// Export report to PDF
JasperExportManager.exportReportToPdfFile(print, "C:/Users/user1/Downloads/JavaBeansPDF.pdf");
}

SUB_DATA_SOURCE是我在报告中定义的参数&amp;我在iReport中使用参数类的子报表:java.util.List

我试图将Class1中的简单值显示到报告中,并且它可以正常工作。

但我的问题是如何将我的列表List<Class4> list4 的内容显示在子报告中。

我需要在报告中显示这个“表格”:

string1 ------- string2 ------- string3 ------- object5.getElement1 ...

abc ------------- cde ---------- test ------------- value1 ...

我不知道我的问题是否清楚,请告诉我是否有疑惑或遗漏。

PS:我正在使用JasperReports v5.6.0和iReport v5.6.0

1 个答案:

答案 0 :(得分:0)

您将Class4作为数据源传递,这意味着您在报告中有此字段定义

<jr:table/>

要在<jr:table/>中显示数据,您需要为此数据创建子报告或使用<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{object2}.getObject3().getList4())]]></dataSourceExpression> 组件。

此子报告或NullPointer的数据源为:

.equals

处理BMap超出了这个答案,我假设您拥有所有字段的公共getter