spring-projects / spring-projects/spring-data-mongodb

Projecting a field within an association fails with `MappingException`

Open
#4,453 1 comment 0 reactions 1 assignee View on GitHub

@christophstrobl is already working on this.

Since Jul 17, 2023.

status: pending-design-work
Dominant language
Java
Stars
1.7k
Forks
1.1k
PR merge metrics
No merged PRs in 30d

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?

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.