From a73be5a8297524216c528a2a73b508694279ca96 Mon Sep 17 00:00:00 2001 From: Kurt Niemi Date: Tue, 25 Apr 2023 21:48:27 -0400 Subject: [PATCH] =?UTF-8?q?Add=20SpEL=20support=20for=20`@Table(schema=3D?= =?UTF-8?q?=E2=80=A6)`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add SpEL support for schema property in `@Table` annotation See #1325 Original pull request: #1461 --- .../mapping/BasicRelationalPersistentEntity.java | 7 +++++++ ...BasicRelationalPersistentEntityUnitTests.java | 16 +++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) 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")