2010-01-13 2 views
1

Supposons que j'ai les objets suivants (une table par objet) avec cette relation: A -> B -> C -> DJPA Hibernate: comment empêcher la jointure lors de la récupération?

Si je findById une instance de A, tous les B, C et D sont retournés qui n'est-ce pas que je veux? Est-ce possible de forcer Hibernate à retourner seulement A (ou seulement ses propriétés primitives)?

Je sais que je peux écrire "SELECT a.x, a.y, a.z, ... FROM A", puis mettre manuellement la liste des résultats dans A, mais cela est quelque peu opportun car je devrais remplir manuellement toutes les propriétés. J'ai également vérifié tous Hibernate query hints mais rien lié.

Mohsen

+0

réglage général qui est nécessaire dans votre cartographie est fetch = "joindre"? – bertolami

+0

Je n'ai pas de propriétés spécifiques à hibernate. Fetch = FetchType.EAGER de mes associations ManyToOne ou OneToOne qui est inévitable car les relations ne sont pas obligatoires. – Mohsen

Répondre

2

Si vous avez un constructeur A qui remplit tous les domaines, sauf ceux que vous ne voulez pas participer, vous pouvez sélectionner comme ceci:

SELECT NEW A(a.x, a.y, a.z) FROM A a 
+0

est cette fonctionnalité spécifique Hibernate ou JPA? – Mohsen

+0

Ceci est une caractéristique de JPA. – Bob

+0

Merci pour votre aide, mais de cette façon, je devrais ajouter un nouveau constructeur pour chaque requête qui est un cauchemar. – Mohsen

2

choisir un de A a?

aussi, comment avez-vous cartographié vos relations? paresseux = "proxy" et fetch = "rejoindre"?

+0

La définition de lazy = "proxy" et fetch = "join" est globale et affecte toutes les autres requêtes. Ceci est une exigence de requête unique. – Mohsen

+1

Utilisez l'API de critères si vous souhaitez spécifier des méthodes d'extraction personnalisées. –

1

Vous pouvez spécifier fetch = "select" et lazy = "true" dans votre mapping. Surtout si vos relations -> sont des listes.

+0

J'ai une relation d'objet à objet (pas de liste: un à un ou plusieurs à un, où A est plusieurs côtés). La définition de lazy ou fetch est globale et affecte toutes les autres requêtes. Ceci est une exigence de requête unique. – Mohsen

+0

Si vous utilisez les critères API, vous pouvez spécifier le type d'extraction. Je ne sais pas comment/si vous pouvez le faire avec hql. – bertolami

Questions connexes