1 回答
TA贡献1884条经验 获得超4个赞
在jrxml你可以定义结构化字段(嵌套对象)是这样的:
<field name="dateRange" class="my.package.DateRange">
<property name="com.jaspersoft.studio.field.label" value="dateRange"/>
</field>
<field name="posts" class="java.util.List">
<property name="com.jaspersoft.studio.field.label" value="posts"/>
</field>
然后使用来自嵌套对象的值,如$F{dateRange}.getBegin()
.
但是在您的情况下,您似乎总是有一个主题并为其迭代帖子。那么最好是:
将主题作为参数传递:
parameters.put("topic", topic)
DataSource
为帖子创建:JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(topic.getPosts())
topic
在报告中定义参数:<parameter name="topic" class="my.package.Topic"/>
在报告中使用参数表达式呈现主题值:
$P{topic}.getTopicName()
为报告中的 Post 定义字段
在报告中使用
$F{postName}
详细信息带中的字段(即)呈现帖子值- JasperReport 将自动迭代所有帖子并呈现它们
更新(回答问题的更新部分):要呈现Collection
( List
)类型的值,您可以使用子报表 - 请参阅此处:在 iReport 中的列表中创建子报表这意味着您将创建子报表来呈现用户值。
或者您可以使用从用户列表中创建table
来呈现用户subDataSet
:
<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
<datasetRun subDataset="usersDataSet">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{users})]]></dataSourceExpression>
</datasetRun>
...
</jr:table>
您还必须subDataset为表定义:
<subDataset name="usersDataSet">
<field name="userName" class="java.lang.String">
<fieldDescription><![CDATA[userName]]></fieldDescription>
</field>
<field name="userPoints" class="java.lang.Integer">
<fieldDescription><![CDATA[userPoints]]></fieldDescription>
</field>
</subDataset>
添加回答
举报