Java 当主报表查询有多个结果集且作为参数输入的子报表无法生成PDF时?

Java 当主报表查询有多个结果集且作为参数输入的子报表无法生成PDF时?,java,jasper-reports,subreport,bytearrayinputstream,Java,Jasper Reports,Subreport,Bytearrayinputstream,我的JasperReports报告有子报告。在主报表中使用ByteArrayInputStream参数,并且主报表查询结果有多行,无法生成pdf。但是主报表查询结果集只有一个结果集PDF要生成,没有任何错误 传递子报表的我的Java代码: Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("subreportParameter", subreportinputst

我的JasperReports报告有子报告。在主报表中使用ByteArrayInputStream参数,并且主报表查询结果有多行,无法生成pdf。但是主报表查询结果集只有一个结果集PDF要生成,没有任何错误

传递子报表的我的Java代码:

Map<String, Object> parameters = new HashMap<String, Object>(); 
parameters.put("subreportParameter", subreportinputstream)
 <subreport>
   <reportElement positionType="Float" x="275" y="55" width="240" height="70" uuid="0010fc8e-593e-45ee-af10-952fd8b54ad5" />
   <subreportParameter name="reportid">
      <subreportParameterExpression><![CDATA[$P{reportid}]]></subreportParameterExpression>
   </subreportParameter>
   <subreportParameter name="currencycode">
      <subreportParameterExpression><![CDATA[$P{currencycode}]]></subreportParameterExpression>
   </subreportParameter>
   <subreportParameter name="taxcode">
      <subreportParameterExpression><![CDATA[$P{taxcode}]]></subreportParameterExpression>
   </subreportParameter>
   <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
   <subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{subreportParameter}]]></subreportExpression>
</subreport>
<subreport isUsingCache="true">
    ...
jrxml处的参数声明:

这就是我调用subreport的方式:

Map<String, Object> parameters = new HashMap<String, Object>(); 
parameters.put("subreportParameter", subreportinputstream)
 <subreport>
   <reportElement positionType="Float" x="275" y="55" width="240" height="70" uuid="0010fc8e-593e-45ee-af10-952fd8b54ad5" />
   <subreportParameter name="reportid">
      <subreportParameterExpression><![CDATA[$P{reportid}]]></subreportParameterExpression>
   </subreportParameter>
   <subreportParameter name="currencycode">
      <subreportParameterExpression><![CDATA[$P{currencycode}]]></subreportParameterExpression>
   </subreportParameter>
   <subreportParameter name="taxcode">
      <subreportParameterExpression><![CDATA[$P{taxcode}]]></subreportParameterExpression>
   </subreportParameter>
   <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
   <subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{subreportParameter}]]></subreportExpression>
</subreport>
<subreport isUsingCache="true">
    ...

当子报表第二次呈现时,它尝试从$p{subreportParameter}输入流加载报表,但该流在第一次呈现子报表时已被读取,因此再次从该流读取将不会产生任何数据

解决此问题的最简单方法是为子报表设置isUsingCache标志:

Map<String, Object> parameters = new HashMap<String, Object>(); 
parameters.put("subreportParameter", subreportinputstream)
 <subreport>
   <reportElement positionType="Float" x="275" y="55" width="240" height="70" uuid="0010fc8e-593e-45ee-af10-952fd8b54ad5" />
   <subreportParameter name="reportid">
      <subreportParameterExpression><![CDATA[$P{reportid}]]></subreportParameterExpression>
   </subreportParameter>
   <subreportParameter name="currencycode">
      <subreportParameterExpression><![CDATA[$P{currencycode}]]></subreportParameterExpression>
   </subreportParameter>
   <subreportParameter name="taxcode">
      <subreportParameterExpression><![CDATA[$P{taxcode}]]></subreportParameterExpression>
   </subreportParameter>
   <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
   <subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{subreportParameter}]]></subreportExpression>
</subreport>
<subreport isUsingCache="true">
    ...
或者,您可以通过执行JRLoader.loadObjectsubreportinputstream从流中自己加载JasperReport对象,并将JasperReport对象作为报告参数而不是流传递