/**
* 支持内部类的转换
* Object[] 内元素顺序需与目标类属性顺序一致
*/
private <T, O> List<T> fillDataList(List<Object[]> list, Class<T> t, Class<O> outer) {
ArrayList<T> ts = new ArrayList<>();
if (CollectionUtils.isEmpty(list)) {
return ts;
}
for (Object[] o : list) {
T t1 = fillData(o, t, outer);
ts.add(t1);
}
return ts;
}
@SneakyThrows
private <T, O> T fillData(Object[] o, Class<T> t, Class<O> outerT) {
T t1;
int size;
Field[] fields = t.getDeclaredFields();
if (null == outerT) {
size = Math.min(o.length, fields.length);
t1 = t.newInstance();
} else {
// 内部类有一个隐藏属性:外部类的引用
size = Math.min(o.length, fields.length - 1);
Class<?> aClass = Class.forName(t.getName());
Class<?> outerClass = Class.forName(outerT.getName());
t1 = (T) aClass.getDeclaredConstructor(outerClass).newInstance(outerClass.newInstance());
}
for (int i = 0; i < size; i++) {
Object o1 = o[i];
Field field = fields[i];
field.setAccessible(true);
String typeName = field.getGenericType().getTypeName();
// 支持String,Integer,Long,BigDecimal类型
if (String.class.getName().equals(typeName)) {
o1 = null == o1 ? null : o1.toString();
}
if (Integer.class.getName().equals(typeName)) {
o1 = null == o1 ? null : Integer.valueOf(o1.toString());
}
if (Long.class.getName().equals(typeName)) {
o1 = null == o1 ? null : Long.valueOf(o1.toString());
}
if (BigDecimal.class.getName().equals(typeName)) {
o1 = null == o1 ? null : new BigDecimal(o1.toString());
}
field.set(t1, o1);
}
return t1;
}
JPA 框架使用nativeQuery ,返回List<Object[]> 封装JAVA对象
最新推荐文章于 2023-08-13 01:37:47 发布