diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntity.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntity.java index 83f8461094..037ed819d3 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntity.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntity.java @@ -47,6 +47,7 @@ class BasicRelationalPersistentEntity extends BasicPersistentEntity> schemaName; + private final @Nullable Expression schemaNameExpression; private final ExpressionEvaluator expressionEvaluator; private boolean forceQuote = true; @@ -77,12 +78,14 @@ class BasicRelationalPersistentEntity extends BasicPersistentEntity Optional.of(createSqlIdentifier(table.schema()))) : defaultSchema; + this.schemaNameExpression = detectExpression(table.schema()); } else { this.tableName = Lazy.of(() -> createDerivedSqlIdentifier(namingStrategy.getTableName(getType()))); this.tableNameExpression = null; this.schemaName = defaultSchema; + this.schemaNameExpression = null; } } @@ -144,6 +147,10 @@ public SqlIdentifier getQualifiedTableName() { return getTableName(); } + if (schemaNameExpression != null) { + schema = createSqlIdentifier(expressionEvaluator.evaluate(schemaNameExpression)); + } + return SqlIdentifier.from(schema, getTableName()); } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntityUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntityUnitTests.java index c2dd6ee465..05087f92c6 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntityUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntityUnitTests.java @@ -126,7 +126,7 @@ void testRelationalPersistentEntitySpelExpression_Sanitized() { RelationalPersistentEntity entity = mappingContext.getRequiredPersistentEntity(LittleBobbyTables.class); SqlIdentifier simpleExpected = quoted("RobertDROPTABLEstudents"); - SqlIdentifier expected = SqlIdentifier.from(quoted("LITTLE_BOBBY_TABLES"), simpleExpected); + SqlIdentifier expected = SqlIdentifier.from(quoted("RandomSQLToExecute"), simpleExpected); assertThat(entity.getQualifiedTableName()).isEqualTo(expected); assertThat(entity.getTableName()).isEqualTo(simpleExpected); } @@ -175,18 +175,24 @@ private static class EntityWithSchemaAndName { @Id private Long id; } - @Table(schema = "HELP_ME_OBI_WON", name = "#{T(org.springframework.data.relational.core.mapping." - + "BasicRelationalPersistentEntityUnitTests$EntityWithSchemaAndTableSpelExpression" + ").desiredTableName}") + @Table(schema = "#{T(org.springframework.data.relational.core.mapping." + + "BasicRelationalPersistentEntityUnitTests$EntityWithSchemaAndTableSpelExpression).desiredSchemaName}", + name = "#{T(org.springframework.data.relational.core.mapping." + + "BasicRelationalPersistentEntityUnitTests$EntityWithSchemaAndTableSpelExpression).desiredTableName}") private static class EntityWithSchemaAndTableSpelExpression { @Id private Long id; public static String desiredTableName = "USE_THE_FORCE"; + public static String desiredSchemaName = "HELP_ME_OBI_WON"; } - @Table(schema = "LITTLE_BOBBY_TABLES", name = "#{T(org.springframework.data.relational.core.mapping." - + "BasicRelationalPersistentEntityUnitTests$LittleBobbyTables" + ").desiredTableName}") + @Table(schema = "#{T(org.springframework.data.relational.core.mapping." + + "BasicRelationalPersistentEntityUnitTests$LittleBobbyTables).desiredSchemaName}", + name = "#{T(org.springframework.data.relational.core.mapping." + + "BasicRelationalPersistentEntityUnitTests$LittleBobbyTables).desiredTableName}") private static class LittleBobbyTables { @Id private Long id; public static String desiredTableName = "Robert'); DROP TABLE students;--"; + public static String desiredSchemaName = "Random SQL To Execute;"; } @Table("dummy_sub_entity")