Utilizando Jasper Reports com JPA (Connection)

385 views
Skip to first unread message

Claudinei Filho

unread,
Sep 1, 2015, 9:36:17 AM9/1/15
to javasf: JavaServer Faces Group
Utilizo conexão JPA gerenciada pelo container:

@PersistenceContext(unitName = Constant.PU)
private transient EntityManager em;

Não consigo passar esse connection para o Jasper:
parameters.put(JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, em);

Nem assim:
JasperPrint jasperPrint =
 
JasperFillManager.fillReport(context.getRealPath(path + reportFile), parameters, (Connection) em);


Como vocês resolvem isso, passando a lista já populada no dataset ou existe outra forma?

Rafael Ponte

unread,
Sep 1, 2015, 9:42:24 AM9/1/15
to javasf: JavaServer Faces Group
Oi Claudinei,

Normalmente eu penso no relatório somente como um template, somente como uma view na qual devo passar dados para que ela possa se renderizar, semelhante a um JSP por exemplo.

Dessa forma, em vez de passar uma Connection ou EntityManager eu simplesmente faço a consulta dentro da aplicação (independente da tecnologia de persistência) e envio o dataset (conjunto de dados) para o relatório juntamente com os parâmetros necessários.

A vantagem disso é que divido a responsabilidade: 1) consulta e preparo dos dados fica no código Java, onde posso fazer testes de integração e otimizar a consulta em si; 2) apresentação fica no relatório, onde posso enfeitar ou adaptar o layout, formatação de informações (data, hora, monetário etc); 3) e não menos importante, se houver erro na consulta eu sei onde mexer, se houver erro na apresentação eu também sei onde está o problema.

Faz sentido?



--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/javasf.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/javasf/dc849559-e434-44ae-be9e-6ab182e4a6ba%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.
--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Rafael Rossi

unread,
Sep 1, 2015, 9:50:09 AM9/1/15
to jav...@googlegroups.com
Creio que seja uma abordagem bem válida a apresentada pelo Rafael Ponte.

Para mais opções, acesse https://groups.google.com/d/optout.




Avast logo

Este email foi escaneado pelo Avast antivírus.
www.avast.com


Claudinei Filho

unread,
Sep 1, 2015, 9:51:36 AM9/1/15
to javasf: JavaServer Faces Group
Obrigado Rafael, vou seguir essa linha, faz mais sentido mesmo.

Marcelo Garcia

unread,
Sep 1, 2015, 10:22:04 AM9/1/15
to javasf: JavaServer Faces Group
Concordo com o Ponte,

passe apenas a collection utilizada pelo relatório.

Já tive vários problemas de desempenho com relatórios utilizando conexão passada como parâmetro.

Além do mais, se você quiser alterar o gerador de relatório, dessa forma fica mais fácil.

Att

Everton Fujimoto

unread,
Sep 1, 2015, 11:46:48 AM9/1/15
to jav...@googlegroups.com

Eu particularmente costumo utilizar consulta direto no jasper por ver que a equipe tem menos problemas para manutenção quando utilizo a consulta lá... Mas aí vai do perfil dos profissionais envolvidos. ..

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/javasf.

Rafael Ponte

unread,
Sep 1, 2015, 12:19:04 PM9/1/15
to jav...@googlegroups.com
Oi Everton,

Não há qualquer problema nisso, principalmente se a consulta for escrita em SQL puro (eu fazia isso há muito tempo atrás). Assim até mesmo um não-programador poderia desenhar e escrever a consulta dento do relatório.

Como sempre escrevemos testes automatizados nos projetos na qual trabalhamos, extrair a consulta do .jrxml fica melhor de manter e testar.

Um abraço!



Para mais opções, acesse https://groups.google.com/d/optout.

Cássio Oliveira

unread,
Sep 1, 2015, 12:31:01 PM9/1/15
to jav...@googlegroups.com
Rafael Ponte, tem algum exemplo de como vc faz??


---
-----------------------------------------------------------------------------------------------------------------
Cássio OliveiraAnálise e Desenvolvimento de Sistemas - IFPB Monteiro
Técnico em Informática - UEPB Monteiro
-----------------------------------------------------------------------------------------------------------------

Rafael Ponte

unread,
Sep 1, 2015, 12:38:11 PM9/1/15
to jav...@googlegroups.com
Oi,

Código público não tenho. Mas não há nenhum mistério, a coisa é bem simples... deve haver diversos exemplos no web.

Se algum tiver algum exemplo, por favor, cole aqui!


Para mais opções, acesse https://groups.google.com/d/optout.

Davi Mustafa

unread,
Sep 1, 2015, 2:46:10 PM9/1/15
to javasf: JavaServer Faces Group
cara, da uma olhada nesse topico 


ele mostra como fez pra jogar a lista pro ireports.


Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Everton Fujimoto

unread,
Sep 1, 2015, 3:13:56 PM9/1/15
to jav...@googlegroups.com
Exatamente Pontes, o que eu queria destacar é que não existe um "certo" ou "errado", você tem que fazer de acordo com as suas premissas... Eu aqui balizo bastante a arquitetura para ganhar produtividade pelo perfil da equipe, dependendo do perfil da equipe ou mesmo de fatores externos ou outros internos ao projeto você vê como é melhor fazer. 

Att.

Everton William Fujimoto
Tecnólogo em Processamento de Dados - Fatec-SO
Especialista em Gestão de Projetos de Software - IGTI
Mestrando em Administração - UFSC
OCAJP, OCPJP, OCEWCD, OCEWSD, OCEJPA, OCEEJB, OCEJSF, 1Z0-807, OCE SQL Expert

Claudinei Filho

unread,
Oct 5, 2015, 4:09:27 PM10/5/15
to javasf: JavaServer Faces Group
Rafael, estou passando os dados pelo JRBeanCollectionDataSource, e uma entidade simples sem relacionamentos funcionou, porém no caso,minha entidade contém uma lista de produtos e preciso agrupar por essa lista pra vc ter uma ideia a consulta SQL seria +/- essa:

select s.date, s.loss_reason, i.quantity, i.unit, i.value  from  sales_order s
inner join  sales_order_item i
on  s
.id = i.sales_order_id
where  s.status  LIKE 'LOST'

Então eu mando o SalesOrder populado para o relatório e consigo por exemplo pegar o field date assim $F{date}, porém não consigo exibir  items.quantity, etc como eu mapeio isso no Jasper?

ReportController:80 - Error retrieving field value from bean: quantity.


Obrigado



On Tuesday, September 1, 2015 at 10:42:24 AM UTC-3, Rafael Ponte wrote:

Davi Mustafa

unread,
Oct 5, 2015, 4:15:18 PM10/5/15
to javasf: JavaServer Faces Group
tuaLista.tuaSubLista.propriedade

garante que vai ta igual la no iReports e que seja o mesmo tipo de variavel.

tenta ai


Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Claudinei Filho

unread,
Oct 5, 2015, 4:43:12 PM10/5/15
to javasf: JavaServer Faces Group
Não deu certo, tentei de varias formas:

$F{items.quantity}
$F{item.quantity}
$F{items.item.quantity}
$F{salesOrder.items.quantity}

A propriedade é essa:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "salesOrder", fetch = FetchType.EAGER)
private List<SalesOrderItem> items;

Davi Mustafa

unread,
Oct 5, 2015, 4:52:44 PM10/5/15
to javasf: JavaServer Faces Group
Quando tu debuga, o valor da lista que ta indo pra o JRBeanCollectionDataSource, qual que ta sendo o nome da entidade que possui a lista de salesOrder?

Por exemplo: 
- Tua entidade eh "Item" que possui o atributo "List<SalesOrder> sales
- SalesOrder é outra entidade correto? que possui o atributo quantity.

Então se tu ta passando uma lista de "Item" (List<Item> items) pra o 
JRBeanCollectionDataSource, ficaria o seguinte la no iReports:

items.sales.quantity 

Everton Fujimoto

unread,
Oct 5, 2015, 5:23:26 PM10/5/15
to jav...@googlegroups.com
Como o "items" é uma lista, você tem que dizer para o jasper que ele tem que iterar nessa lista. Uma das formas de fazer isso é conforme descrito aqui:  https://www.richardnichols.net/2010/02/simple-guide-to-sub-reports-in-jasperreports-ireport/

Att.

Everton William Fujimoto
Tecnólogo em Processamento de Dados - Fatec-SO
Especialista em Gestão de Projetos de Software - IGTI
Mestrando em Administração - UFSC
OCAJP, OCPJP, OCEWCD, OCEWSD, OCEJPA, OCEEJB, OCEJSF, 1Z0-807, OCE SQL Expert

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/javasf.

Davi Mustafa

unread,
Oct 5, 2015, 11:30:53 PM10/5/15
to javasf: JavaServer Faces Group
Dei mole, nem me toquei dos subreports. E nem poderia responder direito porque nunca usei.


Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Claudinei Filho

unread,
Oct 7, 2015, 4:19:24 PM10/7/15
to javasf: JavaServer Faces Group
Com subreport deu certo, valeu.

Lucas de Abreu

unread,
Oct 9, 2015, 12:43:50 PM10/9/15
to javasf: JavaServer Faces Group
Cara se eu entendi seu relatório, eu faria assim, dentro do Details teria as informações do sales_order e uma Table ou List que receberia a sub-lista de itens :)... você vai criar um Dataset e usa-lo.

Digite o código aqui...


<subDataset name="DATASET_ENVOLVIDOS" uuid="7cef2408-3655-45ab-b131-8a8597c1523d">
       
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
       
<queryString>
            <![CDATA[]]>
       
</queryString>
       
<field name="observacao" class="java.lang.String">
           
<fieldDescription><![CDATA[observacao]]></fieldDescription>
       
</field>
       
<!-- etc -->
   
</subDataset>


<componentElement>
               
<reportElement positionType="Float" x="0" y="140" width="554" height="20" uuid="f6c9535e-f297-416c-bb44-d47f7f532f80">
                   
<property name="local_mesure_unitheight" value="pixel"/>
                   
<property name="com.jaspersoft.studio.unit.height" value="px"/>
               
</reportElement>
               
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                   
<datasetRun subDataset="DATASET_MEMBROS" uuid="1ffdbf44-8576-47e8-a264-b608f02df658">
                       
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanArrayDataSource($F{MEMBROS}.toArray())]]></dataSourceExpression>
                   
</datasetRun>
                   
<jr:listContents height="20" width="554">
                       
<!-- etc -->
                   
</jr:listContents>
               
</jr:list>
           
</componentElement>

abraços


Em terça-feira, 1 de setembro de 2015 10:36:17 UTC-3, Claudinei Filho escreveu:
Reply all
Reply to author
Forward
0 new messages