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 e216ee4865..77d10a7c11 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 @@ -37,6 +37,7 @@ * @author Bastian Wilhelm * @author Mikhail Polivakha * @author Kurt Niemi + * @author Sergey Korotaev */ class BasicRelationalPersistentEntity extends BasicPersistentEntity implements RelationalPersistentEntity { @@ -44,9 +45,9 @@ class BasicRelationalPersistentEntity extends BasicPersistentEntity tableName; - private final @Nullable Expression tableNameExpression; + private final Lazy tableNameExpression; private final Lazy> schemaName; - private final @Nullable Expression schemaNameExpression; + private final Lazy schemaNameExpression; private final ExpressionEvaluator expressionEvaluator; private boolean forceQuote = true; @@ -72,19 +73,19 @@ class BasicRelationalPersistentEntity extends BasicPersistentEntity StringUtils.hasText(table.value()) ? createSqlIdentifier(table.value()) : createDerivedSqlIdentifier(namingStrategy.getTableName(getType()))); - this.tableNameExpression = detectExpression(table.value()); + this.tableNameExpression = Lazy.of(() -> detectExpression(table.value())); this.schemaName = StringUtils.hasText(table.schema()) ? Lazy.of(() -> Optional.of(createSqlIdentifier(table.schema()))) : defaultSchema; - this.schemaNameExpression = detectExpression(table.schema()); + this.schemaNameExpression = Lazy.of(() -> detectExpression(table.schema())); } else { this.tableName = Lazy.of(() -> createDerivedSqlIdentifier(namingStrategy.getTableName(getType()))); - this.tableNameExpression = null; + this.tableNameExpression = Lazy.empty(); this.schemaName = defaultSchema; - this.schemaNameExpression = null; + this.schemaNameExpression = Lazy.empty(); } } @@ -93,17 +94,20 @@ class BasicRelationalPersistentEntity extends BasicPersistentEntity implements RelationalPersistentProperty { @@ -51,11 +52,11 @@ public class BasicRelationalPersistentProperty extends AnnotationBasedPersistent private final Lazy columnName; private final boolean hasExplicitColumnName; - private final @Nullable Expression columnNameExpression; + private final Lazy columnNameExpression; private final SqlIdentifier sequence; private final Lazy> collectionIdColumnName; private final Lazy collectionKeyColumnName; - private final @Nullable Expression collectionKeyColumnNameExpression; + private final Lazy collectionKeyColumnNameExpression; private final boolean isEmbedded; private final String embeddedPrefix; @@ -101,10 +102,10 @@ public BasicRelationalPersistentProperty(Property property, PersistentEntity StringUtils.hasText(mappedCollection.keyColumn()) ? createSqlIdentifier(mappedCollection.keyColumn()) : createDerivedSqlIdentifier(namingStrategy.getKeyColumn(this))); - this.collectionKeyColumnNameExpression = detectExpression(mappedCollection.keyColumn()); + this.collectionKeyColumnNameExpression = Lazy.of(() -> detectExpression(mappedCollection.keyColumn())); } else { - this.collectionKeyColumnNameExpression = null; + this.collectionKeyColumnNameExpression = Lazy.empty(); } if (isAnnotationPresent(Column.class)) { @@ -114,7 +115,7 @@ public BasicRelationalPersistentProperty(Property property, PersistentEntity StringUtils.hasText(column.value()) ? createSqlIdentifier(column.value()) : createDerivedSqlIdentifier(namingStrategy.getColumnName(this))); - this.columnNameExpression = detectExpression(column.value()); + this.columnNameExpression = Lazy.of(() -> detectExpression(column.value())); if (collectionIdColumnName == null && StringUtils.hasText(column.value())) { collectionIdColumnName = Lazy.of(() -> Optional.of(createSqlIdentifier(column.value()))); @@ -123,7 +124,7 @@ public BasicRelationalPersistentProperty(Property property, PersistentEntity createDerivedSqlIdentifier(namingStrategy.getColumnName(this))); - this.columnNameExpression = null; + this.columnNameExpression = Lazy.empty(); } this.sequence = determineSequenceName(); @@ -145,17 +146,19 @@ void setExpressionEvaluator(ExpressionEvaluator expressionEvaluator) { * {@link LiteralExpression} (indicating that no subsequent evaluation is necessary). * * @param potentialExpression can be {@literal null} - * @return can be {@literal null}. */ - @Nullable - private static Expression detectExpression(@Nullable String potentialExpression) { + private SqlIdentifier detectExpression(@Nullable String potentialExpression) { if (!StringUtils.hasText(potentialExpression)) { return null; } Expression expression = PARSER.parseExpression(potentialExpression, ParserContext.TEMPLATE_EXPRESSION); - return expression instanceof LiteralExpression ? null : expression; + if (expression instanceof LiteralExpression) { + return null; + } + + return createSqlIdentifier(expressionEvaluator.evaluate(expression)); } private SqlIdentifier createSqlIdentifier(String name) { @@ -186,12 +189,8 @@ public boolean isEntity() { @Override public SqlIdentifier getColumnName() { - - if (columnNameExpression == null) { - return columnName.get(); - } - - return createSqlIdentifier(expressionEvaluator.evaluate(columnNameExpression)); + return columnNameExpression.getOptional() + .orElse(columnName.get()); } @Override @@ -218,11 +217,8 @@ public SqlIdentifier getKeyColumn() { return null; } - if (collectionKeyColumnNameExpression == null) { - return collectionKeyColumnName.get(); - } - - return createSqlIdentifier(expressionEvaluator.evaluate(collectionKeyColumnNameExpression)); + return collectionKeyColumnNameExpression.getOptional() + .orElse(collectionKeyColumnName.get()); } @Override