diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java index 7f8ec91fe..df1bd6d18 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java @@ -615,8 +615,15 @@ public class Criteria implements CriteriaDefinition { */ public Criteria alike(Example sample) { - criteria.put("$example", sample); - return this; + if (StringUtils.hasText(this.getKey())) { + + criteria.put("$example", sample); + return this; + } + + Criteria exampleCriteria = new Criteria(); + exampleCriteria.criteria.put("$example", sample); + return registerCriteriaChainElement(exampleCriteria); } /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryByExampleTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryByExampleTests.java index 2ba4d1aed..a1f7a778b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryByExampleTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryByExampleTests.java @@ -134,16 +134,14 @@ public class QueryByExampleTests { assertThat(result).containsExactlyInAnyOrder(p1, p2, p3); } - @Test // DATAMONGO-1245 + @Test // DATAMONGO-1245, GH-3544 public void findByExampleWithCriteria() { Person sample = new Person(); sample.lastname = "stark"; - Query query = new Query(new Criteria().alike(Example.of(sample)).and("firstname").regex("^ary*")); - - List result = operations.find(query, Person.class); - assertThat(result).hasSize(1); + Query query = new Query(new Criteria().alike(Example.of(sample)).and("firstname").regex(".*n.*")); + assertThat(operations.find(query, Person.class)).containsExactly(p1); } @Test // DATAMONGO-1459 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 d6eacdd10..d39dc2ff7 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 @@ -772,6 +772,19 @@ public class QueryMapperUnitTests { assertThat(document.get("legacyPoint.y")).isEqualTo(20D); } + @Test // GH-3544 + public void exampleWithCombinedCriteriaShouldBeMappedCorrectly() { + + Foo probe = new Foo(); + probe.embedded = new EmbeddedClass(); + probe.embedded.id = "conflux"; + + Query query = query(byExample(probe).and("listOfItems").exists(true)); + org.bson.Document document = mapper.getMappedObject(query.getQueryObject(), context.getPersistentEntity(Foo.class)); + + assertThat(document).containsEntry("embedded\\._id", "conflux").containsEntry("my_items", new org.bson.Document("$exists", true)); + } + @Test // DATAMONGO-1988 public void mapsStringObjectIdRepresentationToObjectIdWhenReferencingIdProperty() {