Gelera estou trabalhando com o ireport + hibernnate, estou com um pequeno problema que tenho certeza que vcs iram tirar de letra.
Seguinte tenho várias classes mapeadas vou usar o exemplo da minha classe Estoque. Dentro dela tenho mapeado um relacionamento com a classe EstoqueFk e Produto, então para mim acessar um atributo da classe Produto tenho que fazer assim.: estoque.estoquefk.produto.nmProduto até aí blz.
estou mandando para o relatório uma lista da consulta de estoque, vou colocar o método para gerar o relatório.
@Viewless
public void geraRelatorio() throws Exception{
/*
* Codigo para consultar a lista
*/
PersistenciaDAO<Produto> persistenciaProduto = new PersistenciaDAO<Produto>();
List<Produto> list = persistenciaProduto.listarGenerico("SELECT e FROM Estoque e ");
/*
* Final da consulta, retorna array para converter em pdf
*/
//Localiza o contexto da pasta onde esta localizado o .jasper
String pathJasper = servletContext.getRealPath("/ireport/") + "/";
//Faz o mapeamento do context para levar o .jasper a conversao em bytes
Map parametros = new HashMap();
parametros.put("ireport", pathJasper);
parametros.put("estoque", list);
try {
//Recebe a lista do array populado
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list);
//pega o ds + a conexao para ir ate o ireport para listar o array dentro do relatoriof
JasperPrint impressao = JasperFillManager.fillReport(pathJasper + "/etiqueta.jasper",parametros, ds);
//converte o relatorio em bytes gerando o pdf
byte[] bytes = JasperExportManager.exportReportToPdf(impressao);
byte[] arquivo = bytes;
//Tratamento para exportacao do pdf para a url do browser e o tratamento de erros.
String nomeDoArquivo = "etiqueta.pdf";
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=".concat(nomeDoArquivo));
response.setContentLength(arquivo.length);
ServletOutputStream sos = response.getOutputStream();
sos.write(arquivo, 0, arquivo.length);
sos.flush();
sos.close();
} catch (Exception e) {
if(e.getClass().getSimpleName().equals("AbortException")){
System.out.println("Documento cancelado");
} else{
System.out.println("Outros");
}
}
}
Então tenho no map o diretório onde está mapeado meu .jasper e o resultado da consulta para enviar por parametro.
Lá no ireport está assim:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport
name="etiqueta"
columnCount="1"
printOrder="Vertical"
orientation="Portrait"
pageWidth="595"
pageHeight="842"
columnWidth="535"
columnSpacing="0"
leftMargin="20"
rightMargin="20"
topMargin="20"
bottomMargin="20"
whenNoDataType="NoPages"
isTitleNewPage="false"
isSummaryNewPage="false">
<property name="ireport.scriptlethandling" value="0" />
<property name="ireport.encoding" value="UTF-8" />
<import value="java.util.*" />
<import value="net.sf.jasperreports.engine.*" />
<import value="net.sf.jasperreports.engine.data.*" />
<parameter name="estoque" isForPrompting="false" class="java.lang.Object"/>
<field name="estoqueFk" class="com.estoque.bean.fk.EstoqueFk">
<fieldDescription><![CDATA[estoqueFk]]></fieldDescription>
</field>
<variable name="estoque" class="com.estoque.bean.Estoque" resetType="Report" calculation="Nothing">
<variableExpression><![CDATA[$P{estoque}]]></variableExpression>
</variable>
<background>
<band height="0" isSplitAllowed="true" >
</band>
</background>
<title>
<band height="0" isSplitAllowed="true" >
</band>
</title>
<pageHeader>
<band height="1" isSplitAllowed="true" >
</band>
</pageHeader>
<columnHeader>
<band height="0" isSplitAllowed="true" >
</band>
</columnHeader>
<detail>
<band height="126" isSplitAllowed="true" >
<rectangle>
<reportElement
x="4"
y="2"
width="368"
height="120"
key="rectangle-1"/>
<graphicElement stretchType="NoStretch"/>
</rectangle>
<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
<reportElement
x="19"
y="17"
width="315"
height="18"
key="textField"/>
<box></box>
<textElement>
<font/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$V{estoque}.getEstoqueFk().getProduto().getNmProduto()]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
<reportElement
x="20"
y="49"
width="315"
height="18"
key="textField-1"/>
<box></box>
<textElement>
<font/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$V{estoque}.getEstoqueFk().getProduto().getCdBarras()]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="1" isSplitAllowed="true" >
</band>
</columnFooter>
<pageFooter>
<band height="0" isSplitAllowed="true" >
</band>
</pageFooter>
<summary>
<band height="0" isSplitAllowed="true" >
</band>
</summary>
</jasperReport>
Seguinte quando eu gero o pdf ele trás a quantidade de todos os produtos no estoque porém tudo null, tipo gera as páginas com os quadrados mais tudo null e não dá erro de compilação, o que pode ser???