Skip to content

Commit 0f7ca81

Browse files
schlagi123schauder
authored andcommitted
DATAJDBC-334 - Fixes broken parameter names for quoted column names.
When a column has a quoted name it contains characters illegal for parameter names. Therefore the parameter names now get sanitised. Original pull request: #120.
1 parent 61a54ca commit 0f7ca81

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/SqlGenerator.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.List;
2323
import java.util.Map;
2424
import java.util.Set;
25+
import java.util.regex.Pattern;
2526
import java.util.stream.Collectors;
2627
import java.util.stream.Stream;
2728

@@ -66,6 +67,8 @@ class SqlGenerator {
6667
private final Lazy<String> deleteByListSql = Lazy.of(this::createDeleteByListSql);
6768
private final SqlGeneratorSource sqlGeneratorSource;
6869

70+
private final Pattern parameterPattern = Pattern.compile("\\W");
71+
6972
SqlGenerator(RelationalMappingContext context, RelationalPersistentEntity<?> entity,
7073
SqlGeneratorSource sqlGeneratorSource) {
7174

@@ -340,6 +343,7 @@ private String createInsertSql(Set<String> additionalColumns) {
340343
String tableColumns = String.join(", ", columnNamesForInsert);
341344

342345
String parameterNames = columnNamesForInsert.stream()//
346+
.map(this::columnNameToParameterName)
343347
.map(n -> String.format(":%s", n))//
344348
.collect(Collectors.joining(", "));
345349

@@ -353,10 +357,11 @@ private String createUpdateSql() {
353357
String setClause = columnNames.stream() //
354358
.filter(s -> !s.equals(entity.getIdColumn())) //
355359
.filter(s -> !readOnlyColumnNames.contains(s)) //
356-
.map(n -> String.format("%s = :%s", n, n)) //
360+
.map(n -> String.format("%s = :%s", n, columnNameToParameterName(n))) //
357361
.collect(Collectors.joining(", "));
358362

359-
return String.format(updateTemplate, entity.getTableName(), setClause, entity.getIdColumn(), entity.getIdColumn());
363+
return String.format(updateTemplate, entity.getTableName(), setClause, entity.getIdColumn(),
364+
columnNameToParameterName(entity.getIdColumn()));
360365
}
361366

362367
private String createDeleteSql() {
@@ -447,4 +452,8 @@ private String cascadeConditions(String innerCondition, PersistentPropertyPath<R
447452
entity.getTableName(), innerCondition //
448453
);
449454
}
455+
456+
private String columnNameToParameterName(String columnName){
457+
return parameterPattern.matcher(columnName).replaceAll("");
458+
}
450459
}

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/SqlGeneratorUnitTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
* @author Jens Schauder
4343
* @author Greg Turnquist
4444
* @author Oleksandr Kucher
45+
* @author Bastian Wilhelm
4546
*/
4647
public class SqlGeneratorUnitTests {
4748

@@ -206,6 +207,17 @@ public void getInsertForEmptyColumnList() {
206207
assertThat(insert).endsWith("()");
207208
}
208209

210+
@Test // DATAJDBC-334
211+
public void getInsertForQuotedColumnName() {
212+
SqlGenerator sqlGenerator = createSqlGenerator(EntityWithQuotedColumnName.class);
213+
214+
String insert = sqlGenerator.getInsert(emptySet());
215+
216+
assertThat(insert).isEqualTo("INSERT INTO entity_with_quoted_column_name " +
217+
"(\"test_@123\") " +
218+
"VALUES (:test_123)");
219+
}
220+
209221
@Test // DATAJDBC-266
210222
public void joinForOneToOneWithoutIdIncludesTheBackReferenceOfTheOuterJoin() {
211223

@@ -240,6 +252,17 @@ public void readOnlyPropertyExcludedFromQuery_when_generateUpdateSql() {
240252
);
241253
}
242254

255+
@Test // DATAJDBC-334
256+
public void getUpdateForQuotedColumnName() {
257+
SqlGenerator sqlGenerator = createSqlGenerator(EntityWithQuotedColumnName.class);
258+
259+
String update = sqlGenerator.getUpdate();
260+
261+
assertThat(update).isEqualTo("UPDATE entity_with_quoted_column_name " +
262+
"SET \"test_@123\" = :test_123 " +
263+
"WHERE \"test_@id\" = :test_id");
264+
}
265+
243266
@Test // DATAJDBC-324
244267
public void readOnlyPropertyExcludedFromQuery_when_generateInsertSql() {
245268

@@ -378,4 +401,9 @@ static class EntityWithReadOnlyProperty {
378401
String name;
379402
@ReadOnlyProperty String readOnlyValue;
380403
}
404+
405+
static class EntityWithQuotedColumnName {
406+
@Id @Column("\"test_@id\"") Long id;
407+
@Column("\"test_@123\"") String name;
408+
}
381409
}

0 commit comments

Comments
 (0)