Skip to content

Commit c78bfae

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. Compared to the version on master testing is more lenient. This accounts for the SqlGenerator behaving slightly different then on master. Original pull request: #120. See also: https://jira.spring.io/browse/DATAJDBC-262.
1 parent 88bcd82 commit c78bfae

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222
import java.util.Map;
2323
import java.util.Set;
24+
import java.util.regex.Pattern;
2425
import java.util.stream.Collectors;
2526
import java.util.stream.Stream;
2627

@@ -40,6 +41,7 @@
4041
*
4142
* @author Jens Schauder
4243
* @author Yoichi Imai
44+
* @author Bastian Wilhelm
4345
*/
4446
class SqlGenerator {
4547

@@ -61,6 +63,8 @@ class SqlGenerator {
6163
private final Lazy<String> deleteByListSql = Lazy.of(this::createDeleteByListSql);
6264
private final SqlGeneratorSource sqlGeneratorSource;
6365

66+
private final Pattern parameterPattern = Pattern.compile("\\W");
67+
6468
SqlGenerator(RelationalMappingContext context, RelationalPersistentEntity<?> entity,
6569
SqlGeneratorSource sqlGeneratorSource) {
6670

@@ -263,6 +267,7 @@ private String createInsertSql(Set<String> additionalColumns) {
263267
String tableColumns = String.join(", ", columnNamesForInsert);
264268

265269
String parameterNames = columnNamesForInsert.stream()//
270+
.map(this::columnNameToParameterName)
266271
.map(n -> String.format(":%s", n))//
267272
.collect(Collectors.joining(", "));
268273

@@ -274,10 +279,11 @@ private String createUpdateSql() {
274279
String updateTemplate = "UPDATE %s SET %s WHERE %s = :%s";
275280

276281
String setClause = columnNames.stream()//
277-
.map(n -> String.format("%s = :%s", n, n))//
282+
.map(n -> String.format("%s = :%s", n, columnNameToParameterName(n))) //
278283
.collect(Collectors.joining(", "));
279284

280-
return String.format(updateTemplate, entity.getTableName(), setClause, entity.getIdColumn(), entity.getIdColumn());
285+
return String.format(updateTemplate, entity.getTableName(), setClause, entity.getIdColumn(),
286+
columnNameToParameterName(entity.getIdColumn()));
281287
}
282288

283289
private String createDeleteSql() {
@@ -349,4 +355,8 @@ private String cascadeConditions(String innerCondition, PersistentPropertyPath<R
349355
entity.getTableName(), innerCondition //
350356
);
351357
}
358+
359+
private String columnNameToParameterName(String columnName){
360+
return parameterPattern.matcher(columnName).replaceAll("");
361+
}
352362
}

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
*
3939
* @author Jens Schauder
4040
* @author Greg Turnquist
41+
* @author Bastian Wilhelm
4142
*/
4243
public class SqlGeneratorUnitTests {
4344

@@ -189,15 +190,34 @@ public void getInsertForEmptyColumnList() {
189190
assertThat(insert).endsWith("()");
190191
}
191192

193+
@Test // DATAJDBC-334
194+
public void getInsertForQuotedColumnName() {
195+
SqlGenerator sqlGenerator = createSqlGenerator(EntityWithQuotedColumnName.class);
196+
197+
String insert = sqlGenerator.getInsert(emptySet());
198+
199+
assertThat(insert)
200+
.isEqualTo("INSERT INTO entity_with_quoted_column_name " + "(\"test_@123\") " + "VALUES (:test_123)");
201+
}
202+
203+
@Test // DATAJDBC-334
204+
public void getUpdateForQuotedColumnName() {
205+
SqlGenerator sqlGenerator = createSqlGenerator(EntityWithQuotedColumnName.class);
206+
207+
String update = sqlGenerator.getUpdate();
208+
209+
assertThat(update).startsWith("UPDATE entity_with_quoted_column_name " + "SET ")
210+
.endsWith("\"test_@123\" = :test_123 " + "WHERE \"test_@id\" = :test_id");
211+
}
212+
192213
private PersistentPropertyPath<RelationalPersistentProperty> getPath(String path, Class<?> base) {
193214
return PersistentPropertyPathTestUtils.getPath(context, path, base);
194215
}
195216

196217
@SuppressWarnings("unused")
197218
static class DummyEntity {
198219

199-
@Column("id1")
200-
@Id Long id;
220+
@Column("id1") @Id Long id;
201221
String name;
202222
ReferencedEntity ref;
203223
Set<Element> elements;
@@ -239,4 +259,8 @@ static class IdOnlyEntity {
239259
@Id Long id;
240260
}
241261

262+
static class EntityWithQuotedColumnName {
263+
@Id @Column("\"test_@id\"") Long id;
264+
@Column("\"test_@123\"") String name;
265+
}
242266
}

0 commit comments

Comments
 (0)