vendredi 10 février 2023

Fetcher les enfants d'une entité

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