Relatórios com JPA

Galera,

To usando o JPA aqui num sisteminha. Bem interessante.

Acontece que tenho uma tela de relatório consolidado, que mostram dados que não refletem necessariamente uma entidade persistente do meu sistema.

Como vocês fazem pra buscar os dados desse relatório? Via SQL/JDBC normal? Ou há alguma forma de mapear um DTO para isso?

Eu vi isso aqui num artigo da Oracle:

[code]@Entity
@NamedQueries(@NamedQuery(name=“generateReport”,
query=" SELECT NEW com.ssg.article.ReportDTO(p.name, SUM(pen.amount))
FROM Party p LEFT JOIN p.penalties pen GROUP BY p.name"") )

public abstract class Party {

}[/code]
http://www.oracle.com/technology/pub/articles/gupta-jpa.html

Aguardo sugestões.

Tá aí uma resposta que eu queria ter também, pois pra fazer relatórios mais complexos deve ser uma canseira…

A Paz!

E porque as tabelas não poderiam ser mapeadas para entidades e depois fazer uma consulta usando hql?

Então me responde como você faria um SUM, GROUP BY ou COUNT assim?

Não entendi o problema:

select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
from Cat cat
select cat.weight + sum(kitten.weight) 
from Cat cat 
    join cat.kittens kitten
group by cat.id, cat.weight

Qual é o problema de fazer desta forma?

http://www.hibernate.org/hib_docs/entitymanager/reference/en/html/queryhql.html

Sim, mas neste caso, a classe Cat não teria os atributos max e min.
Eu teria de ter um DTO só para os dados desta query.

Eu sempre crio relatórios passando um array de objetos e não criando consultas que já trazem o que eu preciso do banco…

Acho que não custa nada ter um bean só pra armazenar os dados do relatório, vc só vai precisar dele para isso mesmo…

Fala Destro…

Não é necessário criar um bean pra ser populado com a resposta da hql.
Você pode pegar o array de objects que ela retorna.

Não teria os atributos e nem mesmo deveria ter. A solução que eu uso para estes problemas é criar um classe para transportar os dados, o que eu não chamo de DTO, pois ela não esta ai para evitar que os objetos distribuidos fiquem se referenciando no momento do marshal e sim para transferir, pela rede ou não, dados extras, como contagem e etc, ao que existe no nos meu objetos percistentes.

Gerar arrays é uma solução, mas se vc tiver que montar um relatorio complexo, que tem por ex linhas e colunas dinamicas, utilizar arrays vai deixar o trabalho inlegivel no final. (no meu ponto de vista)
Utilizar objetos com nomes significativos, neste e em todos os casos, facilita muito a manutenção do sistema.