From c7800a65493be31f49d44ae89855242f35170d18 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 30 Apr 2024 09:59:01 +0200 Subject: [PATCH] Fix NPE when rendering untyped aggregation operation as part of criteria query. Resolves: #4687 Original pull request: #4695 --- .../data/mongodb/core/convert/QueryMapper.java | 7 +++++-- .../data/mongodb/core/convert/QueryMapperUnitTests.java | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index 38a107cc7..eaa7b2cb7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -588,8 +588,11 @@ public class QueryMapper { } if (source instanceof AggregationExpression age) { - return age - .toDocument(new RelaxedTypeBasedAggregationOperationContext(entity.getType(), this.mappingContext, this)); + + if(entity == null) { + return age.toDocument(); + } + return age.toDocument(new RelaxedTypeBasedAggregationOperationContext(entity.getType(), this.mappingContext, this)); } if (source instanceof MongoExpression exr) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java index 0e5beac6f..018dff7c5 100755 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java @@ -1529,6 +1529,15 @@ public class QueryMapperUnitTests { assertThat(mappedObject).isEqualTo("{ $expr : { $expr : { $gt : [ '$foo', '$budget'] } } }"); } + @Test // GH-4687 + void usageOfUntypedAggregationShouldRenderOperationsAsIs() { + + Query query = query(expr(Expr.valueOf(ComparisonOperators.valueOf("field").greaterThan("budget")))); + org.bson.Document mappedObject = mapper.getMappedObject(query.getQueryObject(), + context.getPersistentEntity(Object.class)); + assertThat(mappedObject).isEqualTo("{ $expr : { $expr : { $gt : [ '$field', '$budget'] } } }"); + } + @Test // GH-2750 void usesMongoExpressionDocumentAsIsIfItIsNotAnAggregationExpression() {