From 761d725fce837ec4122412905dab30749ab61ce1 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 24 Jul 2012 20:43:52 +0200 Subject: [PATCH] DATAMONGO-493 - Fixed broken $ne handling in QueryMapper. $ne expressions are now only being tried to be converted into an ObjectId in case they follow an id property. Previously they tried in every case which might have led to Strings being converted into ObjectIds that accidentally were valid ObjectIds but didn't represent an id at all. --- .../data/mongodb/core/convert/QueryMapper.java | 4 ++-- .../mongodb/core/convert/QueryMapperUnitTests.java | 12 +++++++----- 2 files changed, 9 insertions(+), 7 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 4c6aef514..9f81181bd 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 @@ -85,6 +85,8 @@ public class QueryMapper { ids.add(convertId(id)); } valueDbo.put(inKey, ids.toArray(new Object[ids.size()])); + } else if (valueDbo.containsField("$ne")) { + valueDbo.put("$ne", convertId(valueDbo.get("$ne"))); } else { value = getMappedObject((DBObject) value, null); } @@ -101,8 +103,6 @@ public class QueryMapper { newConditions.add(getMappedObject((DBObject) iter.next(), null)); } value = newConditions; - } else if (key.equals("$ne")) { - value = convertId(value); } newDbo.put(newKey, convertSimpleOrDBObject(value, null)); 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 e95ee32f9..6fb7cfa7a 100644 --- 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 @@ -218,17 +218,19 @@ public class QueryMapperUnitTests { * @see DATAMONGO-493 */ @Test - @SuppressWarnings({ "unchecked", "rawtypes" }) - public void foo() { + public void doesNotTranslateNonIdPropertiesFor$NeCriteria() { - Query query = Query.query(Criteria.where("id").is("id_value").and("publishers").ne("a_string_value")); + ObjectId accidentallyAnObjectId = new ObjectId(); + + Query query = Query.query(Criteria.where("id").is("id_value").and("publishers") + .ne(accidentallyAnObjectId.toString())); DBObject dbObject = mapper.getMappedObject(query.getQueryObject(), context.getPersistentEntity(UserEntity.class)); - assertThat(dbObject.get("publishers"), isA((Class) DBObject.class)); + assertThat(dbObject.get("publishers"), is(instanceOf(DBObject.class))); DBObject publishers = (DBObject) dbObject.get("publishers"); assertThat(publishers.containsField("$ne"), is(true)); - assertThat(publishers.get("$ne"), is((Object) "a_string_value")); + assertThat(publishers.get("$ne"), is(instanceOf(String.class))); } class IdWrapper {