Browse Source

Refactoring.

Clarified nullabillity for Identifier.
Removed usage of deprecated constructor for StringBasedJdbcQuery.

Original pull request #1901
pull/1905/head
Mikhail2048 1 year ago committed by Jens Schauder
parent
commit
08daf47842
No known key found for this signature in database
GPG Key ID: 74F6C554AE971567
  1. 12
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/Identifier.java
  2. 3
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/JdbcIdentifierBuilder.java
  3. 2
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java
  4. 6
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/IdentifierUnitTests.java
  5. 2
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQueryUnitTests.java

12
spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/Identifier.java

@ -24,6 +24,7 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import org.springframework.data.relational.core.sql.SqlIdentifier; import org.springframework.data.relational.core.sql.SqlIdentifier;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
@ -60,17 +61,16 @@ public final class Identifier {
* Creates an {@link Identifier} from {@code name}, {@code value}, and a {@link Class target type}. * Creates an {@link Identifier} from {@code name}, {@code value}, and a {@link Class target type}.
* *
* @param name must not be {@literal null} or empty. * @param name must not be {@literal null} or empty.
* @param value * @param value must not be null
* @param targetType must not be {@literal null}. * @param targetType must not be {@literal null}.
* @return the {@link Identifier} for {@code name}, {@code value}, and a {@link Class target type}. * @return the {@link Identifier} for {@code name}, {@code value}, and a {@link Class target type}.
*/ */
public static Identifier of(SqlIdentifier name, Object value, Class<?> targetType) { public static Identifier of(SqlIdentifier name, Object value, Class<?> targetType) {
Assert.notNull(name, "Name must not be empty"); Assert.notNull(name, "Name must not be empty");
Assert.notNull(value, "Value must not be empty");
Assert.notNull(targetType, "Target type must not be null"); Assert.notNull(targetType, "Target type must not be null");
// TODO: Is value allowed to be null? SingleIdentifierValue says so, but this type doesn't allows it and
// SqlParametersFactory.lambda$forQueryByIdentifier$1 fails with a NPE.
return new Identifier(Collections.singletonList(new SingleIdentifierValue(name, value, targetType))); return new Identifier(Collections.singletonList(new SingleIdentifierValue(name, value, targetType)));
} }
@ -92,7 +92,8 @@ public final class Identifier {
map.forEach((k, v) -> { map.forEach((k, v) -> {
values.add(new SingleIdentifierValue(k, v, v != null ? ClassUtils.getUserClass(v) : Object.class)); Assert.notNull(v, "The source map for identifier cannot contain null values");
values.add(new SingleIdentifierValue(k, v, ClassUtils.getUserClass(v)));
}); });
return new Identifier(Collections.unmodifiableList(values)); return new Identifier(Collections.unmodifiableList(values));
@ -199,9 +200,10 @@ public final class Identifier {
private final Object value; private final Object value;
private final Class<?> targetType; private final Class<?> targetType;
private SingleIdentifierValue(SqlIdentifier name, @Nullable Object value, Class<?> targetType) { private SingleIdentifierValue(SqlIdentifier name, Object value, Class<?> targetType) {
Assert.notNull(name, "Name must not be null"); Assert.notNull(name, "Name must not be null");
Assert.notNull(value, "Name must not be null");
Assert.notNull(targetType, "TargetType must not be null"); Assert.notNull(targetType, "TargetType must not be null");
this.name = name; this.name = name;

3
spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/JdbcIdentifierBuilder.java

@ -40,8 +40,7 @@ public class JdbcIdentifierBuilder {
/** /**
* Creates ParentKeys with backreference for the given path and value of the parents id. * Creates ParentKeys with backreference for the given path and value of the parents id.
*/ */
public static JdbcIdentifierBuilder forBackReferences(JdbcConverter converter, AggregatePath path, public static JdbcIdentifierBuilder forBackReferences(JdbcConverter converter, AggregatePath path, Object value) {
@Nullable Object value) {
Identifier identifier = Identifier.of( // Identifier identifier = Identifier.of( //
path.getTableInfo().reverseColumnInfo().name(), // path.getTableInfo().reverseColumnInfo().name(), //

2
spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java

@ -92,7 +92,7 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery {
public StringBasedJdbcQuery(JdbcQueryMethod queryMethod, NamedParameterJdbcOperations operations, public StringBasedJdbcQuery(JdbcQueryMethod queryMethod, NamedParameterJdbcOperations operations,
@Nullable RowMapper<?> defaultRowMapper, JdbcConverter converter, @Nullable RowMapper<?> defaultRowMapper, JdbcConverter converter,
QueryMethodEvaluationContextProvider evaluationContextProvider) { QueryMethodEvaluationContextProvider evaluationContextProvider) {
this(queryMethod, operations, result -> (RowMapper<Object>) defaultRowMapper, converter, evaluationContextProvider); this(queryMethod.getRequiredQuery(), queryMethod, operations, result -> (RowMapper<Object>) defaultRowMapper, converter, evaluationContextProvider);
} }
/** /**

6
spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/IdentifierUnitTests.java

@ -50,14 +50,16 @@ public class IdentifierUnitTests {
public void parametersWithStringKeysUseObjectAsTypeForNull() { public void parametersWithStringKeysUseObjectAsTypeForNull() {
HashMap<SqlIdentifier, Object> parameters = new HashMap<>(); HashMap<SqlIdentifier, Object> parameters = new HashMap<>();
parameters.put(unquoted("one"), null); Object value = new Object();
parameters.put(unquoted("one"), value);
Identifier identifier = Identifier.from(parameters); Identifier identifier = Identifier.from(parameters);
assertThat(identifier.getParts()) // assertThat(identifier.getParts()) //
.extracting("name", "value", "targetType") // .extracting("name", "value", "targetType") //
.containsExactly( // .containsExactly( //
Assertions.tuple(unquoted("one"), null, Object.class) // Assertions.tuple(unquoted("one"), value, Object.class) //
); );
} }

2
spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQueryUnitTests.java

@ -397,7 +397,7 @@ class StringBasedJdbcQueryUnitTests {
mock(RelationResolver.class)) mock(RelationResolver.class))
: this.converter; : this.converter;
StringBasedJdbcQuery query = new StringBasedJdbcQuery(method, operations, result -> mock(RowMapper.class), StringBasedJdbcQuery query = new StringBasedJdbcQuery(method.getDeclaredQuery(), method, operations, result -> mock(RowMapper.class),
converter, evaluationContextProvider); converter, evaluationContextProvider);
query.execute(arguments); query.execute(arguments);

Loading…
Cancel
Save