Skip to content

Commit a73be5a

Browse files
kurtn718mp911de
authored andcommitted
Add SpEL support for @Table(schema=…).
Add SpEL support for schema property in `@Table` annotation See #1325 Original pull request: #1461
1 parent 549b807 commit a73be5a

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntity.java

+7
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class BasicRelationalPersistentEntity<T> extends BasicPersistentEntity<T, Relati
4747
private final @Nullable Expression tableNameExpression;
4848

4949
private final Lazy<Optional<SqlIdentifier>> schemaName;
50+
private final @Nullable Expression schemaNameExpression;
5051
private final ExpressionEvaluator expressionEvaluator;
5152
private boolean forceQuote = true;
5253

@@ -77,12 +78,14 @@ class BasicRelationalPersistentEntity<T> extends BasicPersistentEntity<T, Relati
7778
this.schemaName = StringUtils.hasText(table.schema())
7879
? Lazy.of(() -> Optional.of(createSqlIdentifier(table.schema())))
7980
: defaultSchema;
81+
this.schemaNameExpression = detectExpression(table.schema());
8082

8183
} else {
8284

8385
this.tableName = Lazy.of(() -> createDerivedSqlIdentifier(namingStrategy.getTableName(getType())));
8486
this.tableNameExpression = null;
8587
this.schemaName = defaultSchema;
88+
this.schemaNameExpression = null;
8689
}
8790
}
8891

@@ -144,6 +147,10 @@ public SqlIdentifier getQualifiedTableName() {
144147
return getTableName();
145148
}
146149

150+
if (schemaNameExpression != null) {
151+
schema = createSqlIdentifier(expressionEvaluator.evaluate(schemaNameExpression));
152+
}
153+
147154
return SqlIdentifier.from(schema, getTableName());
148155
}
149156

spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentEntityUnitTests.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ void testRelationalPersistentEntitySpelExpression_Sanitized() {
126126
RelationalPersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(LittleBobbyTables.class);
127127

128128
SqlIdentifier simpleExpected = quoted("RobertDROPTABLEstudents");
129-
SqlIdentifier expected = SqlIdentifier.from(quoted("LITTLE_BOBBY_TABLES"), simpleExpected);
129+
SqlIdentifier expected = SqlIdentifier.from(quoted("RandomSQLToExecute"), simpleExpected);
130130
assertThat(entity.getQualifiedTableName()).isEqualTo(expected);
131131
assertThat(entity.getTableName()).isEqualTo(simpleExpected);
132132
}
@@ -175,18 +175,24 @@ private static class EntityWithSchemaAndName {
175175
@Id private Long id;
176176
}
177177

178-
@Table(schema = "HELP_ME_OBI_WON", name = "#{T(org.springframework.data.relational.core.mapping."
179-
+ "BasicRelationalPersistentEntityUnitTests$EntityWithSchemaAndTableSpelExpression" + ").desiredTableName}")
178+
@Table(schema = "#{T(org.springframework.data.relational.core.mapping."
179+
+ "BasicRelationalPersistentEntityUnitTests$EntityWithSchemaAndTableSpelExpression).desiredSchemaName}",
180+
name = "#{T(org.springframework.data.relational.core.mapping."
181+
+ "BasicRelationalPersistentEntityUnitTests$EntityWithSchemaAndTableSpelExpression).desiredTableName}")
180182
private static class EntityWithSchemaAndTableSpelExpression {
181183
@Id private Long id;
182184
public static String desiredTableName = "USE_THE_FORCE";
185+
public static String desiredSchemaName = "HELP_ME_OBI_WON";
183186
}
184187

185-
@Table(schema = "LITTLE_BOBBY_TABLES", name = "#{T(org.springframework.data.relational.core.mapping."
186-
+ "BasicRelationalPersistentEntityUnitTests$LittleBobbyTables" + ").desiredTableName}")
188+
@Table(schema = "#{T(org.springframework.data.relational.core.mapping."
189+
+ "BasicRelationalPersistentEntityUnitTests$LittleBobbyTables).desiredSchemaName}",
190+
name = "#{T(org.springframework.data.relational.core.mapping."
191+
+ "BasicRelationalPersistentEntityUnitTests$LittleBobbyTables).desiredTableName}")
187192
private static class LittleBobbyTables {
188193
@Id private Long id;
189194
public static String desiredTableName = "Robert'); DROP TABLE students;--";
195+
public static String desiredSchemaName = "Random SQL To Execute;";
190196
}
191197

192198
@Table("dummy_sub_entity")

0 commit comments

Comments
 (0)