Skip to content

Commit d7163f7

Browse files
authored
fix: Resolve query fetch result in memory to avoid N+1 query problems (#266)
* fix: Resolve query fetch result in memory to avoid N+1 query problems * fix: optimize to one dala loader query
1 parent f817906 commit d7163f7

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,8 @@ protected <T> Stream<T> getResultStream(TypedQuery<T> query,
227227
}
228228

229229
// Let's execute query and get wrap result into stream
230-
return query.getResultStream()
231-
.peek(entityManager::detach);
230+
return query.getResultList()
231+
.stream();
232232
}
233233

234234
protected Object querySingleResult(final DataFetchingEnvironment environment) {

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaToOneDataFetcher.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616

1717
package com.introproventures.graphql.jpa.query.schema.impl;
1818

19+
import static javax.persistence.metamodel.Attribute.PersistentAttributeType.EMBEDDED;
20+
1921
import java.util.Optional;
2022

21-
import javax.persistence.metamodel.Attribute.PersistentAttributeType;
2223
import javax.persistence.metamodel.SingularAttribute;
2324

2425
import org.dataloader.DataLoader;
@@ -27,6 +28,7 @@
2728
import org.dataloader.MappedBatchLoaderWithContext;
2829

2930
import graphql.GraphQLContext;
31+
import graphql.language.Argument;
3032
import graphql.language.Field;
3133
import graphql.schema.DataFetcher;
3234
import graphql.schema.DataFetchingEnvironment;
@@ -55,11 +57,12 @@ public Object get(DataFetchingEnvironment environment) {
5557
GraphQLType parentType = environment.getParentType();
5658

5759
Object source = environment.getSource();
60+
Optional<Argument> whereArgument = queryFactory.getArgument(field, "where");
5861
Boolean isOptional = queryFactory.getOptionalArgumentValue(environment,
5962
field,
6063
attribute);
6164
// Resolve collection query if where argument is present
62-
if (isOptional && !PersistentAttributeType.EMBEDDED.equals(attribute.getPersistentAttributeType())) {
65+
if ((whereArgument.isPresent() && isOptional) && !EMBEDDED.equals(attribute.getPersistentAttributeType())) {
6366
Object parentIdValue = queryFactory.getParentIdAttributeValue(source);
6467
String dataLoaderKey = parentType.getName() + "." + Optional.ofNullable(field.getAlias())
6568
.orElseGet(attribute::getName);

0 commit comments

Comments
 (0)