Description
Originally reported by kliarist at spring-projects/spring-graphql#746:
I am using spring-graphql
along with spring-data-mongo
and querydsl
and faced with the below issue
org.springframework.data.mapping.MappingException: Invalid path reference articles.title; Associations can only be pointed to directly or via their id property
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.getPath(QueryMapper.java:1275) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:1134) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:1111) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.convert.QueryMapper.createPropertyField(QueryMapper.java:365) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.convert.QueryMapper.lambda$mapFieldsToPropertyNames$0(QueryMapper.java:234) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at java.base/java.util.Map.forEach(Map.java:713) ~[na:na]
at org.springframework.data.mongodb.core.convert.QueryMapper.mapFieldsToPropertyNames(QueryMapper.java:232) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedFields(QueryMapper.java:220) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.QueryOperations$QueryContext.getMappedFields(QueryOperations.java:363) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2573) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.ExecutableFindOperationSupport$ExecutableFindSupport.doFind(ExecutableFindOperationSupport.java:177) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.core.ExecutableFindOperationSupport$ExecutableFindSupport.all(ExecutableFindOperationSupport.java:135) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.data.mongodb.repository.support.SimpleMongoRepository$FluentQueryByExample.all(SimpleMongoRepository.java:391) ~[spring-data-mongodb-4.1.1.jar:4.1.1]
at org.springframework.graphql.data.query.QueryByExampleDataFetcher$ManyEntityFetcher.getResult(QueryByExampleDataFetcher.java:751) ~[spring-graphql-1.2.1.jar:1.2.1]
Here is my set up :
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Builder
@EqualsAndHashCode
@QueryEntity
@Document(collection = "articles")
public class Article {
@Id
private String id;
private String title;
private Integer minutesRead;
@DBRef(lazy = true)
private User author;
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@EqualsAndHashCode
@Builder
@QueryEntity
@Document(collection = "users")
public class User {
@Id
private String id;
private String name;
private Integer age;
private Date createdAt;
private String nationality;
private List<String> friendsIds;
@DBRef(lazy = true)
private List<Article> articles;
}
@GraphQlRepository
public interface UserRepository extends MongoRepository<User, String>, QuerydslPredicateExecutor<User> {
}
here is my graphql schema:
type Query {
users: [User]
...
}
👍 So while the following graphql seems to work fine:
query {
users {
id
age
name
articles {
id
}
}
}
❌ adding extra properties on the nested articles object does not:
query {
users {
id
age
name
articles {
id
title
}
}
}
throwing org.springframework.data.mapping.MappingException: Invalid path reference articles.title; Associations can only be pointed to directly or via their id property
.
Can you please shed some light as to what is the problem here ?
Also, I have noticed that when using MongoRepository
along with QuerydslPredicateExecutor
then QueryByExampleDataFetcher
takes precedence over QuerydslDataFetcher
. Is this expected behaviour?