#2435 - Fix DBArray is not loaded in asDto Postgres queries

This commit is contained in:
Rob Bygrave committed 2021-11-26 14:32:47 +13:00
1 parent c1a78d3c8b
commit 9af64f61f7
5 files changed
+40 -11

No files matched your search

@@ -37,8 +37,7 @@ final class DtoMetaBuilder {
if (includeMethod(method)) {
try {
final String name = propertyName(method.getName());
final Class<?> propertyType = propertyType(method);
properties.add(new DtoMetaProperty(typeManager, dtoType, method, name, propertyType));
properties.add(new DtoMetaProperty(typeManager, dtoType, method, name));
} catch (Exception e) {
CoreLog.log.debug("exclude on " + dtoType + " method " + method, e);
}
@@ -46,10 +45,6 @@ final class DtoMetaBuilder {
}
}
static Class<?> propertyType(Method method) {
return method.getParameterTypes()[0];
}
static String propertyName(String methodName) {
final String name = methodName.substring(3);
return Character.toLowerCase(name.charAt(0)) + name.substring(1);
@@ -8,6 +8,7 @@ import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.sql.SQLException;
final class DtoMetaProperty implements DtoReadSet {
@@ -19,18 +20,30 @@ final class DtoMetaProperty implements DtoReadSet {
private final MethodHandle setter;
private final ScalarType<?> scalarType;
DtoMetaProperty(TypeManager typeManager, Class<?> dtoType, Method writeMethod, String name, Class<?> propertyType) throws IllegalAccessException, NoSuchMethodException {
DtoMetaProperty(TypeManager typeManager, Class<?> dtoType, Method writeMethod, String name) throws IllegalAccessException, NoSuchMethodException {
this.dtoType = dtoType;
this.name = name;
if (writeMethod != null) {
this.setter = LOOKUP.findVirtual(dtoType, writeMethod.getName(), MethodType.methodType(void.class, propertyType));
this.scalarType = typeManager.getScalarType(propertyType);
this.setter = lookupMethodHandle(dtoType, writeMethod);
this.scalarType = typeManager.getScalarType(propertyType(writeMethod), propertyClass(writeMethod));
} else {
this.scalarType = null;
this.setter = null;
}
}
private static MethodHandle lookupMethodHandle(Class<?> dtoType, Method method) throws NoSuchMethodException, IllegalAccessException {
return LOOKUP.findVirtual(dtoType, method.getName(), MethodType.methodType(method.getReturnType(), method.getParameterTypes()));
}
static Type propertyType(Method method) {
return method.getParameters()[0].getParameterizedType();
}
static Class<?> propertyClass(Method method) {
return method.getParameterTypes()[0];
}
String getName() {
return name;
}
@@ -251,6 +251,18 @@ public final class DefaultTypeManager implements TypeManager {
return nativeMap.get(jdbcType);
}
@Override
public ScalarType<?> getScalarType(Type propertyType, Class<?> propertyClass) {
if (propertyType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType)propertyType;
Type rawType = pt.getRawType();
if (List.class == rawType || Set.class == rawType) {
return getArrayScalarType((Class<?>)rawType, null, propertyType, true);
}
}
return getScalarType(propertyClass);
}
/**
* This can return null if no matching ScalarType is found.
*/
@@ -47,6 +47,13 @@ public interface TypeManager {
*/
ScalarType<?> getScalarType(Class<?> type, int jdbcType);
/**
* Find and return the ScalarType taking into account the property type with generics.
* <p>
* For example Array based ScalarType for types like {@code List<String>}.
*/
ScalarType<?> getScalarType(Type propertyType, Class<?> type);
/**
* Create a ScalarType for an Enum using a mapping (rather than JPA Ordinal
* or String which has limitations).