I have an entity like this
@Entity
@Table(name = "ACQ_OPERATION")
@Getter
@Setter
@NamedEntityGraph(
name = "acquiringoperation-entity-graph",
attributeNodes = {
@NamedAttributeNode("cardData"),
}
)
public class AcquiringOperation extends GenericEntity<Long> {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "card_data_id")
private CardData cardData;
...
}
As you can see CardData entity has a FetchType.LAZY fetch type. I want to fetch AcquiringOperation with CardData in one query with left join.
When I try to get data with JPQL
EntityGraph<AcquiringOperation> entityGraph = (EntityGraph<AcquiringOperation>) dataService.getEntityManager().getEntityGraph("acquiringoperation-entity-graph");
acquiringOperations = dataService.getEntityManager().createQuery("select p from AcquiringOperation p", AcquiringOperation.class)
.setHint("jakarta.persistence.fetchgraph", entityGraph)
.getResultList().stream().limit(10).collect(toList());
I got n+1 queries
For AcquiringOperation entity
select
acquiringo0_.id as id1_1_,
...
from
ncs_core.acq_operation acquiringo0_
and for query for CardData for every record
select
carddata0_.id as id1_5_0_,
...
from
ncs_core.card_data carddata0_
where
carddata0_.id=?
On another hand when I'm using repository for data fetching
public interface AcquiringOperationRepository extends BaseRepository<AcquiringOperation> {
@Override
@EntityGraph(attributePaths = {"cardData"})
List<AcquiringOperation> findAll();
}
acquiringOperations = acquiringOperationRepository.findAll().stream().limit(10).collect(toList());
t works like a charm with one "left joined query"
select
...
carddata1_.year as year6_5_1_
from
ncs_core.acq_operation acquiringo0_
left outer join
ncs_core.card_data carddata1_
on acquiringo0_.card_data_id=carddata1_.id
I want to use JPQL or QDSL queries. How can I do this with JPA Entity Graph?