2011-09-20 9 views
1

Dans un projet JPA, j'ai besoin d'afficher une table dont les données proviennent de 5 entités associées. Sans JPA, je pouvais écrire une requête sql qui relie les 5 tables de base de données et les filtre selon certains critères. Supposons que les champs impliqués dans les critères de filtrage sont uniquement ceux de la première entité. Utilisation de JPA Je peux charger des instances filtrées de la première entité et naviguer dans les propriétés jusqu'à l'entité finale. Ma préoccupation est de cette façon le nombre de requêtes à la base de données peut exploser si je ne peux pas utiliser ou faire une erreur avec l'annotation fecttype = eager. Quelle est la meilleure approche dans de tels cas? Je voudrais avoir un contrôle strict sur les requêtes sql qui seront exécutées, donc je peux les optimiser, mais si j'écris la requête sql avec les jointures à la main, dois-je utiliser le 'old' resultset pour récupérer les données ?Affichage efficace des résultats de plusieurs jointures

+0

Pouvez-vous créer View est sur votre base de données? –

+0

oui, je peux. Malheureusement, les critères de filtrage sont dynamiques, donc je ne peux pas les mettre dans une vue, ou simplement je ne sais pas comment le faire. Ma préoccupation concerne le processus de filtrage: si je crée d'abord la vue puis la filtre, je dois rejoindre une très grande table, pas seulement les lignes qui m'intéressent. Veuillez lire également le commentaire sur la réponse ci-dessous. – Filippo

+0

Ok, utiliser ensemble des vues statiques et des requêtes dynamiques peut être risqué. Pouvez-vous proposer plus d'informations sur le framework ou la base de données? –

Répondre

0

Vous pouvez utiliser la langue de JPA requête intégrée, le JPQL, ne peut pas vous? (Il a un opérateur JOIN à coup sûr.) Sachez cependant que ce n'est pas du SQL standard, seulement quelque chose de similaire, alors lisez attentivement les docs JPQL. Oui, il s'agit encore de requêtes en texte brut incorporées dans du code Java, ce qui est dommage, mais bon, voilà jusqu'où Java peut aller en supportant le processus de développement.

Le principal avantage est que vous obtenez des objets entité à la suite de vos requêtes - même si vous avez encore besoin de les jeter de l'objet. Vous pouvez également utiliser les objets (enregistrements) et leurs variables membres (attributs) directement dans la chaîne de requête. Il s'agit donc d'une amélioration par rapport à l'ancien bon JDBC.

Sinon, vous pouvez également choisir l'API de critères, mais franchement, mes expériences ne sont pas très bien avec elle. La syntaxe est assez horrible et vous finissez par construire vous-même la requête de bas niveau. C'est clairement Java à son pire ... mais au moins les requêtes contenant des chaînes peuvent être éliminées du code. Je ne suis pas sûr que ça en vaille la peine.

Cocher cette page pour plus d'informations et des exemples:

http://download.oracle.com/javaee/6/tutorial/doc/gjise.html

+0

Je suis d'accord sur les critères API, un vrai cauchemar pour les débutants. Mon idée est la suivante: créer une vue 'freak' avec très peu de lignes juste pour en créer une entité (appelons-la summarydata). Créez une requête JPQL avec des jointures et ajoutez des conditions de filtrage dynamiques. Convertissez-le en summarydata et publiez-le dans un jsf h: datatable. Ça devrait marcher, n'est-ce pas? – Filippo

Questions connexes