Comment construire requête HQL, thats marqué LAZY rejoint les sous-tables, automatiquement?
Question
J'ai une entité:
public class Album extends GenericAuditedEntity {
@OneToMany(fetch = FetchType.LAZY)
private Set<Item> itemSet = new HashSet<Item>();
}
Et quand je lance HQL comme ceci: em.createQuery ( "sélectionner un album de un"). getResults ()
il produses beaucoup de requêtes SQL: Un pour sélectionner les données de la table de l'album. Smth comme ceci: sélectionner .... à partir Album_table; Et une requête pour chaque ligne extraite, pour sélectionner des éléments. Smth comme ceci: sélectionnez .... de Item_table iwhere i.Album_id =: Album_id;
Mais quand je lance em.createQuery ( » sélectionnez a.id, b.id de l'album a jointure gauche Point i « ) .GetResults ()
produses une requête SQL. Mais il est résultat est la liste de certains paramètres, que j'ai besoin mis dans les entités manuellement.
Comment puis-je construire HQL avec des jointures mis automatiquement et automatiquement les résultats des entités? Est-il possible?
La solution
Vous devez utiliser rejoindre chercher :
em.createQuery("select a.id, b.id from Album a left join fetch Item i ").getResults();
Notez qu'il ya certains effets secondaires à qui, décrites en détail le lien ci-dessus.
Autres conseils
Si vous utilisez join fetch
alors vous n'avez pas besoin les ID, vous pouvez récupérer l'entité Hibernate remplir également l'association dans son cache de premier niveau
em.createQuery("select a from Album a left join fetch a.itemSet").getResultList();
Toutefois, si vous récupérez les ID, mais veulent des objets / entités peuplées considèrent alors en utilisant un constructeur
em.createQuery("select new com.xxx.AlbumItem(a.id, b.id) from Album a left join fetch a.itemSet b").getResultList();
N'utiliser paresseux fetching. Set chercher le type de désireux