Browse Source

DATAJDBC-464 - Polishing.

Fix generics. Reformat code. Improve method names.

Original pull request: #186.
pull/188/head
Mark Paluch 6 years ago
parent
commit
8de5683b71
No known key found for this signature in database
GPG Key ID: 51A00FA751B91849
  1. 30
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryQuery.java
  2. 20
      spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentProperty.java
  3. 29
      spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/JdbcColumnTypes.java

30
spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryQuery.java

@ -26,7 +26,7 @@ import org.springframework.data.jdbc.core.convert.JdbcConverter;
import org.springframework.data.jdbc.core.convert.JdbcValue; import org.springframework.data.jdbc.core.convert.JdbcValue;
import org.springframework.data.jdbc.support.JdbcUtil; import org.springframework.data.jdbc.support.JdbcUtil;
import org.springframework.data.mapping.callback.EntityCallbacks; import org.springframework.data.mapping.callback.EntityCallbacks;
import org.springframework.data.relational.core.mapping.JdbcCompatibleTypes; import org.springframework.data.relational.core.mapping.JdbcColumnTypes;
import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalMappingContext;
import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
import org.springframework.data.relational.core.mapping.event.AfterLoadCallback; import org.springframework.data.relational.core.mapping.event.AfterLoadCallback;
@ -93,7 +93,7 @@ class JdbcRepositoryQuery implements RepositoryQuery {
this.queryMethod = queryMethod; this.queryMethod = queryMethod;
this.operations = operations; this.operations = operations;
RowMapper rowMapper = determineRowMapper(defaultRowMapper); RowMapper<Object> rowMapper = determineRowMapper(defaultRowMapper);
executor = createExecutor( // executor = createExecutor( //
queryMethod, // queryMethod, //
determineResultSetExtractor(rowMapper != defaultRowMapper ? rowMapper : null), // determineResultSetExtractor(rowMapper != defaultRowMapper ? rowMapper : null), //
@ -103,8 +103,8 @@ class JdbcRepositoryQuery implements RepositoryQuery {
this.converter = converter; this.converter = converter;
} }
private QueryExecutor<Object> createExecutor(JdbcQueryMethod queryMethod, @Nullable ResultSetExtractor extractor, private QueryExecutor<Object> createExecutor(JdbcQueryMethod queryMethod,
RowMapper rowMapper) { @Nullable ResultSetExtractor<Object> extractor, RowMapper<Object> rowMapper) {
String query = determineQuery(); String query = determineQuery();
@ -132,15 +132,13 @@ class JdbcRepositoryQuery implements RepositoryQuery {
return executor.execute(bindParameters(objects)); return executor.execute(bindParameters(objects));
} }
private QueryExecutor<Object> createObjectQueryExecutor(QueryExecutor executor) { private QueryExecutor<Object> createObjectQueryExecutor(QueryExecutor<Object> executor) {
return parameters -> { return parameters -> {
try { try {
Object result; Object result = executor.execute(parameters);
result = executor.execute(parameters);
publishAfterLoad(result); publishAfterLoad(result);
@ -228,7 +226,7 @@ class JdbcRepositoryQuery implements RepositoryQuery {
String parameterName = p.getName().orElseThrow(() -> new IllegalStateException(PARAMETER_NEEDS_TO_BE_NAMED)); String parameterName = p.getName().orElseThrow(() -> new IllegalStateException(PARAMETER_NEEDS_TO_BE_NAMED));
Class<?> parameterType = queryMethod.getParameters().getParameter(p.getIndex()).getType(); Class<?> parameterType = queryMethod.getParameters().getParameter(p.getIndex()).getType();
Class conversionTargetType = JdbcCompatibleTypes.INSTANCE.columnTypeForNonEntity(parameterType); Class<?> conversionTargetType = JdbcColumnTypes.INSTANCE.resolvePrimitiveType(parameterType);
JdbcValue jdbcValue = converter.writeJdbcValue(value, conversionTargetType, JdbcValue jdbcValue = converter.writeJdbcValue(value, conversionTargetType,
JdbcUtil.sqlTypeFor(conversionTargetType)); JdbcUtil.sqlTypeFor(conversionTargetType));
@ -243,10 +241,10 @@ class JdbcRepositoryQuery implements RepositoryQuery {
} }
@Nullable @Nullable
private ResultSetExtractor determineResultSetExtractor(@Nullable RowMapper<?> rowMapper) { @SuppressWarnings({ "rawtypes", "unchecked" })
private ResultSetExtractor<Object> determineResultSetExtractor(@Nullable RowMapper<Object> rowMapper) {
Class<? extends ResultSetExtractor> resultSetExtractorClass = (Class<? extends ResultSetExtractor>) queryMethod Class<? extends ResultSetExtractor> resultSetExtractorClass = queryMethod.getResultSetExtractorClass();
.getResultSetExtractorClass();
if (isUnconfigured(resultSetExtractorClass, ResultSetExtractor.class)) { if (isUnconfigured(resultSetExtractorClass, ResultSetExtractor.class)) {
return null; return null;
@ -262,15 +260,16 @@ class JdbcRepositoryQuery implements RepositoryQuery {
return BeanUtils.instantiateClass(resultSetExtractorClass); return BeanUtils.instantiateClass(resultSetExtractorClass);
} }
private RowMapper determineRowMapper(RowMapper<?> defaultMapper) { @SuppressWarnings("unchecked")
private RowMapper<Object> determineRowMapper(RowMapper<?> defaultMapper) {
Class<?> rowMapperClass = queryMethod.getRowMapperClass(); Class<?> rowMapperClass = queryMethod.getRowMapperClass();
if (isUnconfigured(rowMapperClass, RowMapper.class)) { if (isUnconfigured(rowMapperClass, RowMapper.class)) {
return defaultMapper; return (RowMapper<Object>) defaultMapper;
} }
return (RowMapper) BeanUtils.instantiateClass(rowMapperClass); return (RowMapper<Object>) BeanUtils.instantiateClass(rowMapperClass);
} }
private static boolean isUnconfigured(@Nullable Class<?> configuredClass, Class<?> defaultClass) { private static boolean isUnconfigured(@Nullable Class<?> configuredClass, Class<?> defaultClass) {
@ -297,7 +296,6 @@ class JdbcRepositoryQuery implements RepositoryQuery {
callbacks.callback(AfterLoadCallback.class, entity); callbacks.callback(AfterLoadCallback.class, entity);
} }
} }
private interface QueryExecutor<T> { private interface QueryExecutor<T> {

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

@ -16,11 +16,6 @@
package org.springframework.data.relational.core.mapping; package org.springframework.data.relational.core.mapping;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.time.ZonedDateTime;
import java.time.temporal.Temporal;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@ -35,7 +30,6 @@ import org.springframework.data.util.Lazy;
import org.springframework.data.util.Optionals; import org.springframework.data.util.Optionals;
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.StringUtils; import org.springframework.util.StringUtils;
/** /**
@ -161,16 +155,18 @@ public class BasicRelationalPersistentProperty extends AnnotationBasedPersistent
private Class<?> doGetColumnType() { private Class<?> doGetColumnType() {
if (isReference()) { if (isReference()) {
return columnTypeForReference(); return getReferenceColumnType();
} }
Class columnType = columnTypeIfEntity(getActualType()); if (isEntity()) {
Class<?> columnType = getEntityColumnType(getActualType());
if (columnType != null) { if (columnType != null) {
return columnType; return columnType;
} }
}
Class componentColumnType = JdbcCompatibleTypes.INSTANCE.columnTypeForNonEntity(getActualType()); Class<?> componentColumnType = JdbcColumnTypes.INSTANCE.resolvePrimitiveType(getActualType());
while (componentColumnType.isArray()) { while (componentColumnType.isArray()) {
componentColumnType = componentColumnType.getComponentType(); componentColumnType = componentColumnType.getComponentType();
@ -222,7 +218,7 @@ public class BasicRelationalPersistentProperty extends AnnotationBasedPersistent
Assert.isTrue(isQualified(), "The qualifier column type is only defined for properties that are qualified"); Assert.isTrue(isQualified(), "The qualifier column type is only defined for properties that are qualified");
if (isMap()) { if (isMap()) {
return getTypeInformation().getComponentType().getType(); return getTypeInformation().getRequiredComponentType().getType();
} }
// for lists and arrays // for lists and arrays
@ -261,7 +257,7 @@ public class BasicRelationalPersistentProperty extends AnnotationBasedPersistent
} }
@Nullable @Nullable
private Class columnTypeIfEntity(Class type) { private Class<?> getEntityColumnType(Class<?> type) {
RelationalPersistentEntity<?> persistentEntity = context.getPersistentEntity(type); RelationalPersistentEntity<?> persistentEntity = context.getPersistentEntity(type);
@ -277,7 +273,7 @@ public class BasicRelationalPersistentProperty extends AnnotationBasedPersistent
return idProperty.getColumnType(); return idProperty.getColumnType();
} }
private Class columnTypeForReference() { private Class<?> getReferenceColumnType() {
Class<?> componentType = getTypeInformation().getRequiredComponentType().getType(); Class<?> componentType = getTypeInformation().getRequiredComponentType().getType();
RelationalPersistentEntity<?> referencedEntity = context.getRequiredPersistentEntity(componentType); RelationalPersistentEntity<?> referencedEntity = context.getRequiredPersistentEntity(componentType);

29
spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/JdbcCompatibleTypes.java → spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/JdbcColumnTypes.java

@ -30,28 +30,29 @@ import org.springframework.util.ClassUtils;
* @author Jens Schauder * @author Jens Schauder
* @since 2.0 * @since 2.0
*/ */
public enum JdbcCompatibleTypes { public enum JdbcColumnTypes {
INSTANCE { INSTANCE {
private final Map<Class<?>, Class<?>> javaToDbType = new LinkedHashMap<>(); @SuppressWarnings({ "unchecked", "rawtypes" })
public Class<?> resolvePrimitiveType(Class<?> type) {
{
javaToDbType.put(Enum.class, String.class);
javaToDbType.put(ZonedDateTime.class, String.class);
javaToDbType.put(Temporal.class, Date.class);
}
public Class columnTypeForNonEntity(Class type) {
return javaToDbType.entrySet().stream() // return javaToDbType.entrySet().stream() //
.filter(e -> e.getKey().isAssignableFrom(type)) // .filter(e -> e.getKey().isAssignableFrom(type)) //
.map(e -> (Class) e.getValue()) // .map(e -> (Class<?>) e.getValue()) //
.findFirst() // .findFirst() //
.orElseGet(() -> ClassUtils.resolvePrimitiveIfNecessary(type)); .orElseGet(() -> (Class) ClassUtils.resolvePrimitiveIfNecessary(type));
} }
}; };
public abstract Class columnTypeForNonEntity(Class type); private static final Map<Class<?>, Class<?>> javaToDbType = new LinkedHashMap<>();
static {
javaToDbType.put(Enum.class, String.class);
javaToDbType.put(ZonedDateTime.class, String.class);
javaToDbType.put(Temporal.class, Date.class);
}
public abstract Class<?> resolvePrimitiveType(Class<?> type);
} }
Loading…
Cancel
Save