diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java index d5b87d9e8..85578ad68 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java @@ -24,14 +24,16 @@ import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; +import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; +import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.repository.query.MongoEntityInformation; import org.springframework.data.querydsl.EntityPathResolver; import org.springframework.data.querydsl.QueryDslPredicateExecutor; import org.springframework.data.querydsl.SimpleEntityPathResolver; import org.springframework.data.repository.core.EntityMetadata; import org.springframework.util.Assert; - import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mysema.query.mongodb.MongodbQuery; @@ -39,6 +41,8 @@ import com.mysema.query.mongodb.MongodbSerializer; import com.mysema.query.types.EntityPath; import com.mysema.query.types.Expression; import com.mysema.query.types.OrderSpecifier; +import com.mysema.query.types.Path; +import com.mysema.query.types.PathMetadata; import com.mysema.query.types.Predicate; import com.mysema.query.types.path.PathBuilder; @@ -80,7 +84,7 @@ public class QueryDslMongoRepository extends SimpleM Assert.notNull(resolver); EntityPath path = resolver.createPath(entityInformation.getJavaType()); this.builder = new PathBuilder(path.getType(), path.getMetadata()); - this.serializer = new MongodbSerializer(); + this.serializer = new SpringDataMongodbSerializer(template.getConverter().getMappingContext()); } /* @@ -217,4 +221,31 @@ public class QueryDslMongoRepository extends SimpleM return new OrderSpecifier(order.isAscending() ? com.mysema.query.types.Order.ASC : com.mysema.query.types.Order.DESC, property); } + + /** + * Custom {@link MongodbSerializer} to take mapping information into account when building keys for constraints. + * + * @author Oliver Gierke + */ + static class SpringDataMongodbSerializer extends MongodbSerializer { + + private final MappingContext, MongoPersistentProperty> mappingContext; + + /** + * Creates a new {@link SpringDataMongodbSerializer} for the given {@link MappingContext}. + * @param mappingContext + */ + public SpringDataMongodbSerializer(MappingContext, MongoPersistentProperty> mappingContext) { + this.mappingContext = mappingContext; + } + + @Override + protected String getKeyForPath(Path expr, PathMetadata metadata) { + + Path parent = metadata.getParent(); + MongoPersistentEntity entity = mappingContext.getPersistentEntity(parent.getType()); + MongoPersistentProperty property = entity.getPersistentProperty(metadata.getExpression().toString()); + return property.getFieldName(); + } + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index ec45e65fe..468b30ba8 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -1,3 +1,18 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.data.mongodb.repository; import static java.util.Arrays.*; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java new file mode 100644 index 000000000..fb4956c01 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java @@ -0,0 +1,50 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.repository.support; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; +import org.springframework.data.mongodb.repository.QPerson; +import org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.SpringDataMongodbSerializer; + +import com.mysema.query.types.path.StringPath; + +/** + * Unit tests for {@link SpringDataMongodbSerializer}. + * + * @author Oliver Gierke + */ +public class SpringDataMongodbSerializerUnitTests { + + MongoMappingContext context = new MongoMappingContext(); + SpringDataMongodbSerializer serializer = new QueryDslMongoRepository.SpringDataMongodbSerializer(context); + + @Test + public void uses_idAsKeyForIdProperty() { + + StringPath path = QPerson.person.id; + assertThat(serializer.getKeyForPath(path, path.getMetadata()), is("_id")); + } + + @Test + public void buildsNestedKeyCorrectly() { + StringPath path = QPerson.person.address.street; + assertThat(serializer.getKeyForPath(path, path.getMetadata()), is("street")); + } +}