Comment joindre les deux entités indépendantes en utilisant JPA et Hibernate
J'ai deux tables: l'une contenant l'Adresse et un autre contenant des Photographies. Le seul champ commun entre eux est le PersonID. Ces ont été cartographiés à deux Classes POJO l'Adresse et la Photo. J'ai été en mesure de récupérer des détails dans ces tableaux, la création de critères et d'ajouter des restrictions sur le champs . Comment devrions-nous écrire une jointure sur les deux tableaux. Est-il possible d'obtenir le résultat que deux objets -l'Adresse et la Photo.
Je veux faire une jointure gauche afin que je puisse obtenir les dossiers des personnes sans photos.
J'ai lu que cela est possible uniquement à l'aide de requêtes hql, mais cela Peut être fait en utilisant les critères?
OriginalL'auteur juan | 2012-08-06
Vous devez vous connecter pour publier un commentaire.
Vous pouvez facilement écrire requête HQL qui sera de retour comme étant les deux objets à l'aide de Théta-Jointure (comme Adrian noté). Voici un exemple:
Comme vous pouvez le voir requête retourne la liste de l'Objet[] tableaux qui représente chaque ligne lue. Premier élément de ce tableau contient un obejct et le deuxième élément de l'autre.
EDIT:
Dans le cas d'une jointure gauche je pense que vous devez utiliser SQL natif de la requête (pas de requête HQL). Voici comment vous pouvez le faire:
Cela devrait fonctionner pour votre cas.
Ok. J'ai édité ma réponse et ajout de l'exemple de jointure gauche. Je pense que cela devrait fonctionner pour vous.
peut-on utiliser les requêtes hql dans left join
Serait-il possible de modifier le natif SQL de la requête, de sorte qu'il en résulterait une liste de photos par adresse si plusieurs photos a été lié à une adresse?
OriginalL'auteur dimas
Comme je l'ai expliqué dans cet article, vous avez deux options:
Depuis Hibernate 5.1, vous pouvez utiliser ad-hoc rejoint pour les entités indépendantes.
Avant Hibernate 5.1, vous ne pourriez utiliser de thêta-style jointures. Cependant, un thêta-style de jointure est l'équivalent d'une équi-jointure, donc vous ne pouvez émuler INTÉRIEURE Rejoint pas les Jointures EXTERNES.
Pour plus de détails, consultez cet article.
Vous pouvez utiliser thêta-style jointures.
OriginalL'auteur Vlad Mihalcea
Enfin, après 12 ans, l'équipe d'Hibernate a mettre en œuvre une telle fonctionnalité
De Hibernate docs:
La clause peut également contenir relation explicite des jointures à l'aide de la jointure de mot-clé. Ces jointures peuvent être soit interne ou externe gauche style jointures.
Ou vous pouvez utiliser
WITH
etON
mots-clés. Une remarque sur lesExemple
Actuellement, je suis impatient d'essayer la nouvelle fonction.
unrelated entity
. Ceux-ci sont liés par laphones
de la propriété. Pourriez-vous fournir à la classe d'entité?OriginalL'auteur usr-local-ΕΨΗΕΛΩΝ
Joindre deux entités indépendantes sont possibles dans Hibernate 5.1.
Par exemple :
OriginalL'auteur rex roy
Il est préférable d'avoir une classe contenant ces classes vous souhaitez rejoindre les avoir tous ensemble.
Mais si vous vous joignez à ces tables juste pour quelques fins, vous pouvez utiliser des critères et de charger manuellement les données de chaque table et les mettre ensemble. (et oui, vous pouvez avoir ces tableaux de données séparément si pour l'Adresse et la Photo il y a deux classes distinctes et tables)
Créer une classe avec des attributs que vous avez dans votre jointure. Cette classe doit être lié à une table de base de données avec le nom de qui détient la relation entre les entités. (Ici permet de les appeler
address_photo_rel
tableau). Par conséquent, lorsque hibernate est de créer des tables de classes, cette table de jointure est également créé. Si vous ne le faites pas, et puisque vous avez une relation entre les entités (iciaddress
etphoto
), hibernate finira par créer la table, mais vous n'avez aucun contrôle sur cela, puisque vous n'avez pas une classe.OriginalL'auteur Matin Kh
Ce que vous cherchez est
(Pendant le temps de la question est posée, et cette réponse a été donnée) Hibernate supporte Théta-Jointure qui vous permet de faire 1 & 2. Cependant, seulement jointure interne est disponible pour théta-jointure style.
Personnellement, je vous recommande de modèle de bonnes relations, vous avez juste besoin de 1 & 3, ce qui est bien pris en charge dans les requêtes HQL.
(Une autre réponse a effectivement fourni une mise à jour sur les nouvelles Hibernate fonctionnalité qui permet à cette fonctionnalité, vous pouvez simplement consulter)
Je vais reformuler un peu, mais je ne pense pas que ce que j'ai dit est incomplet: Il n'y a pas de manière appropriée à l'aide de requêtes HQL pour réaliser ce qui est demandé par l'OP. Théta-jointure est le plus proche qu'il peut obtenir, mais comme il n'est pas de faire ce qu'il quoi, j'vais pas la peine de donner l'exemple.
OriginalL'auteur Adrian Shum