diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java index 6be47929d..9de0c2e26 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/CqlIdentifier.java @@ -177,7 +177,8 @@ public final class CqlIdentifier implements Comparable, Serializa * @since 2.1.10 */ public static boolean requiresQuoting(CharSequence chars) { - return QUOTED.matcher(chars).matches() || ReservedKeyword.isReserved(chars); + return QUOTED.matcher(chars).matches() || ReservedKeyword.isReserved(chars) + || (chars.length() > 0 && chars.charAt(0) == '_'); } /** diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/CqlIdentifierUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/CqlIdentifierUnitTests.java index 615c93a9b..e9af25778 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/CqlIdentifierUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/CqlIdentifierUnitTests.java @@ -68,7 +68,7 @@ public class CqlIdentifierUnitTests { @Test public void testIllegals() { - String[] illegals = new String[] { null, "", "a ", "a a", "a\"", "a'", "a''", "\"\"", "''", "-", "a-", "_", "_a" }; + String[] illegals = new String[] { null, "", "a ", "a a", "a\"", "a'", "a''", "\"\"", "''", "-", "a-"}; for (String illegal : illegals) { try { of(illegal); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java index f77e2bcef..16a6f3be9 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/mapping/CassandraMappingContextUnitTests.java @@ -626,6 +626,15 @@ public class CassandraMappingContextUnitTests { assertThat(mappingContext.usesTable(CqlIdentifier.of(tableMetadata.getName()))).isFalse(); } + @Test // DATACASS-747 + public void shouldQuoteFieldName() { + + BasicCassandraPersistentEntity entity = mappingContext.getRequiredPersistentEntity(UnsupportedFieldNames.class); + + CassandraPersistentProperty property = entity.getRequiredPersistentProperty("_ent1"); + assertThat(property.getColumnName()).isEqualTo(CqlIdentifier.quoted("_ent1")); + } + @Table private static class InvalidEntityWithIdAndPrimaryKeyColumn { @Id String foo; @@ -753,4 +762,9 @@ public class CassandraMappingContextUnitTests { @Id String id; Map untyped; } + + class UnsupportedFieldNames { + String _ent1; + String _ent2; + } }