Cet exemple fonctionne sous spring data jpa.
Il est possible dans une requête jpql de charger directement les relations enfants d'un objet et d'éviter le problème des requêtes N +1 lorsqu'on a besoin d'accéder à ces enfants.
Imaginons que vous avez une classe
@Entity
@Table
public class Editeur {
@Id
@NotNull
private Long idEditeur;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "editeur")
private List<Livre> livres = new ArrayList<>();
}
}
Dans le repository de Editeur
@Query(value=""" select e
from Editeur e
JOIN FETCH e.livres """
)
List<Editor> findByEditorWithBook();
Si vous désirez de mettre en place le paging, vous devez aussi spécifier une valeur pour le count Query.
@Query(value="""
select e
from Editeur e JOIN FETCH e.livres
""",
countQuery= """
select count(e)
from Editor e JOIN FETCH e.licences
""")
Page<Editor> findByEditorWithLicence(Pageable pageable);
Si vous ne spécifier rien pour le countQuery, vous auriez l'erreur
query specified join fetching, but the owner of the fetched association was not present in the select list