2010-01-20 9 views
3

Je commence à travailler avec hibernate. Je suis tout à fait confus au sujet HQL ... ils sont rejoint vraiment différent de, disons, mySQL se joint ... En fait, si j'ai deux tables comme le stationnement et Auto je faire:Je ne comprends pas HQL rejoint

select * 
from Parking 
left join on Parking.pid = Auto.parkingId 

ou quelque chose similaire. Au lieu d'hibernate, je vais avoir une classe Parking déjà liée à Auto, et avoir toutes les associations mappées. Donc le joind serait automatiquement résolu par hibernate. Quoi qu'il en soit, j'ai toujours le mot-clé join, mais dans les exemples, il est utilisé d'une manière que je ne comprends pas, en spécifiant généralement une propriété de l'objet dans la clause from ... qu'est-ce que cela signifie? Quel est l'équivalent SQL de cette opération?

Répondre

2

Il est important de se rappeler que HQL parle de classes et de champs, tandis que SQL parle de tables et de colonnes.

Et si vous spécifiez une association, Hibernate fera automatiquement les jointures pour vous. Imaginez une bibliothèque de classes contenant une liste de livres. Chaque livre est dans une bibliothèque.

@Entity public class Library { 
    @OneToMany(mappedBy"library") 
    public List<Book> getBooks() { 
    return books; 
    } 
    ... 
} 

@Entity public class Book { 
    @ManyToOne 
    public Library getLibrary() { 
    return library; 
    } 
    ... 
} 

Ensuite, vous pouvez utiliser hibernate pour trouver un objet bibliothèque pour vous, et vous n'avez pas besoin de spécifier toutes les jointures. Il sait juste quoi faire (bien que vous puissiez souvent l'aider à améliorer ses performances si vous lui donnez plus de détails).

Library library = entityManager.find(Library,1); 
for (Book book : library.getBooks()) { 
    System.out.println("Found book: " + book.toString()); 
} 

Dans mon expérience, il est possible d'obtenir beaucoup fait à l'aide mise en veille prolongée sans utiliser « join » du tout!

Plus de détails sur les annotations à http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

2

Laissez-moi essayer. Voici un exemple que je vous ai déjà donné (prendre de here)

Imaginez le cas d'une boutique en ligne qui vend chemises. Chaque modèle de chemise vient dans un certain nombre de tailles disponibles. Vous voulez une requête pour trouver tous les modèles de chemise avec des tailles plus de 40 ans dans HQL, la requête pourrait être la suivante:

from Shirt shirt 
join shirt.availableSizes size 
where size.number > 40 

En d'autres termes, vous voulez obtenir tous les objets, mais vous avez besoin des critères de recherche pour certaines des tables jointes (et je veux dire joindre une-à-plusieurs - vous avez une collection de availableSizes et vous ne pouvez pas atteindre la propriété number sans la jointure).

modifier
Vous pouvez obtenir plus d'informations à partir here. Il y a quelques explications sur implicite et jointures explicites. Et plus important - certaines stratégies de récupération (dans le cas où vous mettez des connexions entre vos tables comme paresseux mais vous voulez aussi, dans certains cas, les récupérer immédiatement). Lisez-le, si vous ne l'avez pas, vous pourriez le trouver utile.

+0

De cette façon semble que le classique * * rejoindre je le ferais sur un DB relationnelle est déjà fait. Le seul but de la clause de jointure dans HQL est de sélectionner une colonne de la table jointe et de lui imposer des restrictions ... n'est-ce pas? – gotch4

+0

@ gotch4 - bien, pas seulement ça. Voir l'édition, il y a plus d'explications dans l'article auquel je me réfère. – Danail

+1

@Danail: Est-ce que disponibleSize une classe/table individuelle ou juste un champ en chemise? – arjacsoh

Questions connexes