Apprendre comment écrire une requête JPA. S'il vous plaît me dire s'il est possible d'écrire les requêtes ci-dessous plus efficacement, peut-être dans une seule déclaration de sélection. Peut être une jointure, mais je ne sais pas comment le faire.comment écrire une requête JPA
class Relationship {
@ManyToOne
public String relationshipType; //can be MANAGER, CUSTOMER etc
@ManyToOne
public Party partyFrom; // a person who has a relation
@ManyToOne
public Party partyTo; // a group a person relate to
}
Requêtes:
String sql = "";
sql = "select rel.partyTo";
sql += " from Relationship rel";
sql += " where rel.partyFrom = :partyFrom";
sql += " and rel.relationshipType= :typeName";
Query query = Organization.em().createQuery(sql);
query.setParameter("partyFrom", mgr1);
query.setParameter("typeName", "MANAGER");
List<Party> orgList = query.getResultList();
String sql2 = "";
sql2 = "select rel.partyFrom";
sql2 += " from Relationship rel";
sql2 += " where rel.partyTo = :partyToList";
sql2 += " and rel.relationshipType = :typeName2";
Query query2 = Organization.em().createQuery(sql2);
query2.setParameter("partyToList", orgList);
query2.setParameter("typeName2", "CUSTOMER");
List<Party> personList2 = query2.getResultList();
Les deux requêtes fonctionnent. La requête 1 renvoie une liste de groupes, où la personne (mgr1) a une relation MANAGER avec. Requête 2 renvoie toutes les Personnes qu'ils sont CLIENT aux groupes retournés par la requête 1. En effet, j'obtiens une liste de Personne à laquelle ils appartiennent (client) le même groupe où la Personne (mgr1) a une relation MANAGER avec.
Est-il possible de les combiner en une seule instruction sql donc éventuellement un seul accès db?
merci !! .. était parfait (sans id - EDIT) .. acceptera la réponse, attendez de voir si quelqu'un commentaire sur la performance de requête interne .. si c'est la manière optimale de le faire .. merci encore – bsr
La sous-requête sera rapide, puisqu'il ne s'agit pas d'une requête corrélée - elle est calculée une seule fois, comme avec votre code original. Juste aujourd'hui, j'ai remplacé un LEFT JOIN avec un WHERE IN et changé la performance de la requête de 18s à 5s sur le serveur SQL. Vous ne dites pas quelle base de données vous utilisez, mais en général une sous-requête peut surpasser une jointure lorsque vous effectuez un test d'existence et n'utilisez aucune des données. – mdma
merci .. projet d'utiliser PostgreSQL ou Oracle .. J'utilise hibernate ORM, donc peut-être aussi compatible avec d'autres .. pouvez-vous élaborer sur un test d'existence vs n'utiliser aucune des données .. apprendre de nouveaux trucs tous les jours: -) merci .. – bsr