diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java index 52b3422fb..58fae222f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java @@ -197,8 +197,11 @@ class MongoQueryCreator extends AbstractQueryCreator { case IN: return criteria.in(nextAsArray(parameters, property)); case LIKE: + case STARTING_WITH: + case ENDING_WITH: + case CONTAINING: String value = parameters.next().toString(); - return criteria.regex(toLikeRegex(value)); + return criteria.regex(toLikeRegex(value, type)); case REGEX: return criteria.regex(parameters.next().toString()); case EXISTS: @@ -269,7 +272,19 @@ class MongoQueryCreator extends AbstractQueryCreator { return new Object[] { next }; } - private String toLikeRegex(String source) { + private String toLikeRegex(String source, Type type) { + + switch (type) { + case STARTING_WITH: + source = source + "*"; + break; + case ENDING_WITH: + source = "*" + source; + break; + case CONTAINING: + source = "*" + source + "*"; + break; + } return source.replaceAll("\\*", ".*"); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java index ecfcd5028..705261066 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java @@ -244,6 +244,45 @@ public class MongoQueryCreatorUnitTests { assertThat(query.getQueryObject(), is(query(where("creator").is(dbref)).getQueryObject())); } + /** + * @see DATAMONGO-418 + */ + @Test + public void createsQueryWithStartingWithPredicateCorrectly() { + + PartTree tree = new PartTree("findByUsernameStartingWith", User.class); + MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, "Matt"), context); + Query query = creator.createQuery(); + + assertThat(query.getQueryObject(), is(query(where("foo").regex("Matt.*")).getQueryObject())); + } + + /** + * @see DATAMONGO-418 + */ + @Test + public void createsQueryWithEndingWithPredicateCorrectly() { + + PartTree tree = new PartTree("findByUsernameEndingWith", User.class); + MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, "ews"), context); + Query query = creator.createQuery(); + + assertThat(query.getQueryObject(), is(query(where("foo").regex(".*ews")).getQueryObject())); + } + + /** + * @see DATAMONGO-418 + */ + @Test + public void createsQueryWithContainingPredicateCorrectly() { + + PartTree tree = new PartTree("findByUsernameContaining", User.class); + MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, "thew"), context); + Query query = creator.createQuery(); + + assertThat(query.getQueryObject(), is(query(where("foo").regex(".*thew.*")).getQueryObject())); + } + private void assertBindsDistanceToQuery(Point point, Distance distance, Query reference) throws Exception { when(converter.convertToMongoType("Dave")).thenReturn("Dave");