Jpa自定义查询结果封装到实体

工具类

import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.CharSequenceUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 查询结果集转换工具类 ResultConvert
 * 速度优于 JsonUtils.readValue(JsonUtils.toJsonString(lackDetails) ,Req.class); 8倍左右速度,简单测试
 */
public class RC {

    /**
     * 名称转换器接口
     */
    public interface ConverterName {
        String cv(String name);
    }

    // 小驼峰
    public static <T> List<T> toCamelCaseBO(List<Map<String, Object>> maps, Class<T> clazz) {
        return toBO(maps, clazz, name -> name);
    }

    // 小写下划线
    public static <T> List<T> toUnderlineCaseBO(List<Map<String, Object>> maps, Class<T> clazz) {
        return toBO(maps, clazz, CharSequenceUtil::toUnderlineCase);
    }

    // 大写下划线
    public static <T> List<T> toBigUnderlineCaseBO(List<Map<String, Object>> maps, Class<T> clazz) {
        return toBO(maps, clazz, name -> CharSequenceUtil.swapCase(CharSequenceUtil.toUnderlineCase(name)));
    }

    public static <T> List<T> toBO(List<Map<String, Object>> maps, Class<T> clazz, ConverterName converter) {
        List<T> list = new ArrayList<>(maps.size());
        try {
            for (Map<String, Object> map : maps) {
                T instance = clazz.getDeclaredConstructor().newInstance();
                Class<? super T> superclass = clazz;
                do {
                    for (Field field : superclass.getDeclaredFields()) {
                        // 避免改变成员变量的final属性
                        if (Modifier.isFinal(field.getModifiers())) continue;
                        field.setAccessible(true);
                        Object object = Convert.convert(field.getType(), map.get(converter.cv(field.getName())), null);
                        field.set(instance, object);
                    }
                    superclass = superclass.getSuperclass();
                } while (!superclass.equals(Object.class));
                list.add(instance);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return list;
    }
}


使用

Page<Map<String, Object>> page = viewStorageOutDao.findPage(bo, pageable);
List<Map<String, Object>> content = page.getContent();
List<ViewStorageOutDTO> dto = RC.toBigUnderlineCaseBO(content, ViewStorageOutDTO.class);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值