Start here. This is the direct spoken answer to practice first.
Overview
Each strategy controls association loading differently; the correct choice follows the result shape.
A JPQL fetch join loads an association as part of that query and is clear when one known graph is needed. An entity graph declares attributes to fetch and can be applied to repository queries without embedding every fetch choice in JPQL. Batch fetching keeps associations lazy but loads several pending proxies or collections in one secondary query. I choose based on the number of roots, association cardinality, reuse, and pagination.