diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java index 5d06754ee..d2fc701f5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java @@ -18,6 +18,7 @@ package org.springframework.data.document.mongodb.mapping; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; +import java.math.BigInteger; import java.util.Set; import org.bson.types.CodeWScope; @@ -41,6 +42,7 @@ public class MongoMappingContext extends AbstractMappingContext entity) { String idKey = null; if (null != entity && entity.getIdProperty() != null) { @@ -71,17 +73,25 @@ public class QueryMapper { Object value = query.get(key); if (key.equals(idKey)) { if (value instanceof DBObject) { - if ("$in".equals(key)) { + DBObject valueDbo = (DBObject) value; + if (valueDbo.containsField("$in") || valueDbo.containsField("$nin")) { + String inKey = valueDbo.containsField("$in") ? "$in" : "$nin"; List ids = new ArrayList(); - for (Object id : (Object[]) ((DBObject) value).get("$in")) { + for (Object id : (Object[]) valueDbo.get(inKey)) { if (null != converter && !(id instanceof ObjectId)) { - ObjectId oid = converter.convertObjectId(id); - ids.add(oid); + try { + ObjectId oid = converter.convertObjectId(id); + ids.add(oid); + } catch (ConversionFailedException ignored) { + ids.add(id); + } } else { ids.add(id); } } - newDbo.put("$in", ids.toArray(new ObjectId[ids.size()])); + valueDbo.put(inKey, ids.toArray(new Object[ids.size()])); + } else { + value = getMappedObject((DBObject) value, entity); } } else if (null != converter) { try { @@ -90,6 +100,15 @@ public class QueryMapper { } } newKey = "_id"; + } else if (key.startsWith("$") && key.endsWith("or")) { + // $or/$nor + BasicBSONList conditions = (BasicBSONList) value; + BasicBSONList newConditions = new BasicBSONList(); + Iterator iter = conditions.iterator(); + while (iter.hasNext()) { + newConditions.add(getMappedObject((DBObject) iter.next(), entity)); + } + value = newConditions; } else { // TODO: Implement other forms of conversion (like @Alias and whatnot) } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingTests.java index cb249197e..22a20ea0e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingTests.java @@ -122,6 +122,12 @@ public class MappingTests { assertThat(result2.size(), is(1)); assertNotNull(result2.get(0).getLastName()); assertThat(result2.get(0).getLastName(), is("LastName")); + + // Test "in" query + List result3 = template.find(new Query(Criteria.where("lastName").in("LastName")), PersonCustomIdName.class); + assertThat(result3.size(), is(1)); + assertNotNull(result3.get(0).getLastName()); + assertThat(result3.get(0).getLastName(), is("LastName")); } @Test @@ -340,4 +346,20 @@ public class MappingTests { assertThat(p2.getAddress().getCity(), is("New Town")); } + @Test + public void testOrQuery() { + PersonPojo p1 = new PersonPojo(1, "first", ""); + template.save(p1); + PersonPojo p2 = new PersonPojo(2, "second", ""); + template.save(p2); + + Query one = query(where("ssn").is(1)); + Query two = query(where("ssn").is(2)); + List results = template.find(new Query().or(one, two), PersonPojo.class); + + assertNotNull(results); + assertThat(results.size(), is(2)); + assertThat(results.get(1).getSsn(), is(2)); + } + }