Skip to content

Projecting a field within an association fails with MappingException #4453

Open
@mp911de

Description

@mp911de

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?

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions