diff --git a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java index e2e1bd5ed..3b6073c60 100644 --- a/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/DatabasePlatform.java @@ -140,9 +140,25 @@ public class DatabasePlatform { private static final char BACK_TICK = '`'; /** - * The like clause. Can be overridden to disable default escape character. + * The non-escaped like clause (to stop slash being escaped on some platforms). + * Used for the 'raw like' expression but not for startsWith, endsWith and contains expressions. */ - protected String likeClause = "like ?"; + protected String likeClauseRaw = "like ? escape''"; + + /** + * Escaped like clause for startsWith, endsWith and contains. + */ + protected String likeClauseEscaped = "like ? escape'|'"; + + /** + * Escape character used for startsWith, endsWith and contains. + */ + protected char likeEscapeChar = '|'; + + /** + * Characters escaped for startsWith, endsWith and contains. + */ + protected char[] likeSpecialCharacters = { '%', '_', '|' }; protected DbEncrypt dbEncrypt; @@ -177,8 +193,6 @@ public class DatabasePlatform { protected SqlExceptionTranslator exceptionTranslator = new SqlCodeTranslator(); - protected char[] specialLikeCharacters = { '%', '_', '\\' }; - /** * Instantiates a new database platform. */ @@ -583,8 +597,8 @@ public class DatabasePlatform { *
* This may include an escape clause to disable a default escape character.
*/
- public String getLikeClause() {
- return likeClause;
+ public String getLikeClause(boolean rawLikeExpression) {
+ return rawLikeExpression ? likeClauseRaw : likeClauseEscaped;
}
/**
@@ -627,7 +641,7 @@ public class DatabasePlatform {
for (int i = 0; i < value.length(); i++) {
char ch = value.charAt(i);
boolean escaped = false;
- for (char escapeChar: specialLikeCharacters) {
+ for (char escapeChar: likeSpecialCharacters) {
if (ch == escapeChar) {
if (sb == null) {
sb = new StringBuilder(value.substring(0, i));
@@ -649,6 +663,6 @@ public class DatabasePlatform {
}
protected void escapeLikeCharacter(char ch, StringBuilder sb) {
- sb.append('\\').append(ch);
+ sb.append(likeEscapeChar).append(ch);
}
}
diff --git a/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java b/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java
index ccc9b9fc6..c8bcbd7f6 100644
--- a/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java
+++ b/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java
@@ -26,10 +26,7 @@ public class DB2Platform extends DatabasePlatform {
this.dbIdentity.setSupportsGetGeneratedKeys(true);
this.dbIdentity.setSupportsSequence(true);
-
- this.likeClause = "like ? escape '|'";
- this.specialLikeCharacters = new char[] { '%', '_', '|' };
-
+
this.exceptionTranslator =
new SqlErrorCodes()
.addAcquireLock("40001","57033") // key -911/-913
diff --git a/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java b/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java
index 21b9c903b..f004be7d5 100644
--- a/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java
+++ b/src/main/java/io/ebean/config/dbplatform/mysql/MySqlPlatform.java
@@ -49,8 +49,8 @@ public class MySqlPlatform extends DatabasePlatform {
this.openQuote = "`";
this.closeQuote = "`";
// use pipe for escaping as it depends if mysql runs in no_backslash_escapes or not.
- this.likeClause = "like binary ? escape '|'";
- this.specialLikeCharacters = new char[] { '%', '_', '|' };
+ this.likeClauseRaw = "like binary ? escape ''";
+ this.likeClauseEscaped = "like binary ? escape '|'";
this.forwardOnlyHintOnFindIterate = true;
this.booleanDbType = Types.BIT;
diff --git a/src/main/java/io/ebean/config/dbplatform/oracle/OraclePlatform.java b/src/main/java/io/ebean/config/dbplatform/oracle/OraclePlatform.java
index 4e51d4e4c..5f0b1ca3e 100644
--- a/src/main/java/io/ebean/config/dbplatform/oracle/OraclePlatform.java
+++ b/src/main/java/io/ebean/config/dbplatform/oracle/OraclePlatform.java
@@ -36,9 +36,7 @@ public class OraclePlatform extends DatabasePlatform {
dbIdentity.setSupportsGetGeneratedKeys(true);
this.treatEmptyStringsAsNull = true;
-
- this.likeClause = "like ? escape '|'";
- this.specialLikeCharacters = new char[] { '%', '_', '|' };
+ this.likeClauseRaw = "like ?";
this.exceptionTranslator =
new SqlErrorCodes()
diff --git a/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerPlatform.java b/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerPlatform.java
index ef3b38c31..f0ed6744a 100644
--- a/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerPlatform.java
+++ b/src/main/java/io/ebean/config/dbplatform/sqlserver/SqlServerPlatform.java
@@ -39,8 +39,9 @@ public class SqlServerPlatform extends DatabasePlatform {
this.openQuote = "[";
this.closeQuote = "]";
- this.specialLikeCharacters = new char[]{'%', '_', '['};
- this.likeClause = "like ? COLLATE Latin1_General_BIN";
+ this.likeSpecialCharacters = new char[]{'%', '_', '['};
+ this.likeClauseRaw = "like ? collate Latin1_General_BIN";
+ this.likeClauseEscaped = "like ? collate Latin1_General_BIN";
booleanDbType = Types.INTEGER;
dbTypeMap.put(DbType.BOOLEAN, new DbPlatformType("bit default 0"));
diff --git a/src/main/java/io/ebeaninternal/api/SpiExpressionRequest.java b/src/main/java/io/ebeaninternal/api/SpiExpressionRequest.java
index 4eb6a1284..49bb47bf9 100644
--- a/src/main/java/io/ebeaninternal/api/SpiExpressionRequest.java
+++ b/src/main/java/io/ebeaninternal/api/SpiExpressionRequest.java
@@ -64,7 +64,7 @@ public interface SpiExpressionRequest {
/**
* Append a DB Like clause.
*/
- void appendLike();
+ void appendLike(boolean rawLikeExpression);
/**
* Escapes a string to use it as exact match in Like clause.
diff --git a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
index 82ab72153..98692c0fc 100644
--- a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
+++ b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
@@ -132,8 +132,8 @@ public final class OrmQueryRequest