diff --git a/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java b/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java index 8a8a10f98..27eb6d152 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java @@ -241,7 +241,15 @@ public final class ExpressionUtils { public static Expression likeToRegex(Expression expr){ // TODO : this should take the escape character into account if (expr instanceof Constant) { - return ConstantImpl.create(expr.toString().replace("%", ".*").replace("_", ".")); + String like = expr.toString(); + if (!like.startsWith("%") && !like.startsWith("_")) { + like = "^" + like; + } + if (!like.endsWith("%") && !like.endsWith("_")) { + like = like + "$"; + } + like = like.replace("%", ".*").replace("_", "."); + return ConstantImpl.create(like); } else if (expr instanceof Operation) { Operation o = (Operation)expr; if (o.getOperator() == Ops.CONCAT) { diff --git a/querydsl-core/src/test/java/com/mysema/query/types/ExpressionUtilsTest.java b/querydsl-core/src/test/java/com/mysema/query/types/ExpressionUtilsTest.java index 4c2401712..a7bd9a033 100644 --- a/querydsl-core/src/test/java/com/mysema/query/types/ExpressionUtilsTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/types/ExpressionUtilsTest.java @@ -30,6 +30,8 @@ public class ExpressionUtilsTest { @Test public void LikeToRegex() { assertEquals(".*", regex(ConstantImpl.create("%"))); + assertEquals("^abc.*", regex(ConstantImpl.create("abc%"))); + assertEquals(".*abc$", regex(ConstantImpl.create("%abc"))); assertEquals(".", regex(ConstantImpl.create("_"))); StringPath path = new StringPath("path"); diff --git a/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbSerializer.java b/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbSerializer.java index a9e52bfbd..e450fae26 100644 --- a/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbSerializer.java +++ b/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbSerializer.java @@ -153,6 +153,10 @@ public class MongodbSerializer implements Visitor { } else if (op == Ops.MATCHES_IC) { return asDBObject(asDBKey(expr, 0), Pattern.compile(asDBValue(expr, 1).toString(), Pattern.CASE_INSENSITIVE)); + } else if (op == Ops.LIKE) { + String regex = ExpressionUtils.likeToRegex((Expression)expr.getArg(1)).toString(); + return asDBObject(asDBKey(expr, 0), Pattern.compile(regex)); + } else if (op == Ops.BETWEEN) { BasicDBObject value = new BasicDBObject("$gte", asDBValue(expr, 1)); value.append("$lte", asDBValue(expr, 2)); diff --git a/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java b/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java index 5b8410a3e..cea6f902f 100644 --- a/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java +++ b/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java @@ -236,6 +236,14 @@ public class MongodbQueryTest { assertQuery(user.firstName.matches(".*aa.*[^i]$"), u3, u4, u1); } + + @Test + public void Like() { + assertQuery(user.firstName.like("Jaan%"), u3, u4); + assertQuery(user.firstName.like("jaan%")); + + assertQuery(user.lastName.like("%unen"), u2, u1); + } @Test public void IsNotNull(){