2010-09-30 5 views
2

J'ai rapporté avec jasperreports et JPA, tous ces rapports ne sont que des "catalogues" dans lesquels la seule information est une entité ou parfois une entité avec ses entités liées.Rapports complexes avec JPA et JasperReports

Maintenant je dois concevoir des rapports avec des informations très complexes (regroupement, résumé, champs ne faisant pas partie d'une entité etc.) ce qui n'est pas possible avec mes entités (Oui je sais que je peux modifier ma conception mais je fais Je pense que c'est bon pour mon application).

J'ai réfléchi à différentes alternatives, comme passer une connexion jdbc même si cela implique de créer des méthodes dans mes classes pour passer cet objet à la vue (qui génère le rapport).

Un autre est de créer un autre contexte (application) qui accède à la base de données à sa manière (quelque chose comme BI), donc cette application serait séparée de mon application d'origine.

J'espère que quelqu'un peut commenter ou me donner un meilleur moyen d'y parvenir. Par ailleurs, mon cadre c'est le printemps.

Merci.

Répondre

2

Je recommande d'utiliser l'option de connexion JDBC lors de la génération d'un rapport complexe, ne serait-ce que pour la flexibilité obtenue en écrivant directement le code SQL. Mais avoir une connexion JDBC intrusion dans votre couche de vue ne sonne pas bien, donc sans savoir beaucoup sur Spring, je dis déplacer la génération de rapport vers le niveau de service lui renvoyant l'objet JasperPrint (qui est sérialisable) à la couche de vue où ça peut être présenté.

Voici un exemple RMI simple, à peu près comme je le fais. Je suppose que cela peut être traduit en un haricot de printemps en quelque sorte.

public interface ReportService extends Remote { 
    public JasperPrint fillReport(final JasperReport report, final Map reportParameters)throws RemoteException, JRException; 
} 

public class ReportServiceImpl implements ReportService { 

    final Connection connection; 

    public ReportServiceImpl(final Connection connection) { 
    this.connection = connection; 
    } 

    public JasperPrint fillReport(final JasperReport report, final Map reportParameters) throws RemoteException, JRException { 
    return JasperFillManager.fillReport(report, reportParameters, connection); 
    } 
} 

Une modification qui vient à l'esprit, sans jeu de mots, serait d'avoir la méthode fillReport prendre un nom de rapport ou le chemin comme argument au lieu de l'objet JasperReport réelle et ont la charge de la couche de service (et cache il, puisque le chargement du rapport est une opération relativement coûteuse). Faites-moi savoir si vous voulez que je développe certaines parties de cet exemple, mais je dois vous avertir que je suis un programmeur de bureau/Swing avec une expérience rudimentaire en front-end Web.

+0

Je vous remercie de votre avis, il est très important, je suis d'accord que le passage de l'objet Connection à la couche de vue est une très mauvaise idée, il semble beaucoup mieux de générer le rapport dans la couche de service. Je serai très reconnaissant si vous pouvez me fournir ces exemples. Je vous remercie. – OJVM

+0

j'ai oublié d'écrire mon e-mail c'est ojvm24 à gmail dot com – OJVM

+0

En ce moment, je suis passin la connexion à la couche de vue, mais je vais essayer votre solution, merci. – OJVM

Questions connexes