Comment construire requête HQL, thats marqué LAZY rejoint les sous-tables, automatiquement?

StackOverflow https://stackoverflow.com/questions/1472122

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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top