当前位置: 首页 > news >正文

spring data jpa自定义bean字段映射

当遇到复杂多表查询时,并且同时还需要确保查询性能,此时则需要使用自定义sql查询,然而spring data jpa对于自定义sql则需使用查询需要在对应的bean中做太多的配置映射,我尝试了一下,最终还是没成功。故选择了另一种方式来解决。

     String sql = "select a.name,b.className,a.createTime from A a left join B b on a.id = b.id";
     Query query = entityManager.createNativeQuery(sql);     //此方法是将数据集合转换位map类型的List集合
    //query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(HashMap.class)); List<Object[]> resultList = query.getResultList(); List<MyEntity> list = CommonUtils.castEntity(resultList, MyEntity.class);

使用entityManage创建nativeQuery,此时获取到的结果集返回的数据是 List<Object[]> 类型的,由于我所需要的字段仅只有name,className,createTime,故构造对应的bean。

public class MyEntity {

    private String name;

    private String className;

    private Long createTime;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public Long getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Long createTime) {
        this.createTime = createTime;
    }
  //必须构建的构造方法,含有查询列所有的对应的字段
    public MyEntity(String name, String className, BigInteger createTime) {
        this.name = name;
        this.className = className;
        this.createTime = createTime != null ? createTime.longValue() : null ;
    }

    public MyEntity() {
    }
}

由于数据库中createTime保存的是Long型,发现用 entityManager 获取到的是 BigInteger ,故构造方法的参数类型设为BigInteger,是为了便于数据做转换。

/**
     * 数组集合转化为指定对象集合
     * 指定的实体对象必须包含所以字段的构造方法,数组的元素的顺序将和构造方法顺序和类型一一对应
     * @param list
     * @param clazz
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz) throws Exception {
        List<T> returnList = new ArrayList<>();
        if (list.size() == 0){
            return returnList;
        }
        Class[] c2 = null;
        Constructor[] constructors = clazz.getConstructors();
        for (Constructor constructor : constructors){
            Class[] tClass = constructor.getParameterTypes();
            if (tClass.length == list.get(0).length){
                c2 = tClass;
                break;
            }
        }
        //构造方法实例化对象
        for(Object[] o : list){
            Constructor<T> constructor = clazz.getConstructor(c2);
            returnList.add(constructor.newInstance(o));
        }

        return returnList;
    }

上面方法则是对数据进行了转换,通过反射构造方法进行实例化对象。返回目标类型的List集合。

转载于:https://www.cnblogs.com/suiyueqiannian/p/6626414.html

相关文章:

  • Java 利用枚举实现单例模式
  • Bzoj3611 [Heoi2014]大工程
  • HashMap的简单实现
  • 【后缀自动机】hihocoder1441 后缀自动机一·基本概念
  • kafka之zk搭建
  • 机器学习 —— 基础整理(一)贝叶斯决策论;二次判别函数;贝叶斯错误率;生成式模型的参数方法...
  • C# Int转Enum
  • 开启TDE的RDS SQL Server还原到本地环境
  • 如何使用thinkphp的model来验证前端表单?
  • 磁盘文件系统2
  • 201521123009 《Java程序设计》第6周学习总结
  • Java深入 - 深入理解Java集合
  • [转] CSSOM视图模式(CSSOM View Module)相关整理
  • 批处理数字前加0
  • MySQL innodb_table_stats表不存在的解决方法
  • [NodeJS] 关于Buffer
  • 230. Kth Smallest Element in a BST
  • cookie和session
  • JS函数式编程 数组部分风格 ES6版
  • linux安装openssl、swoole等扩展的具体步骤
  • mysql 5.6 原生Online DDL解析
  • ng6--错误信息小结(持续更新)
  • nginx 负载服务器优化
  • pdf文件如何在线转换为jpg图片
  • Python爬虫--- 1.3 BS4库的解析器
  • supervisor 永不挂掉的进程 安装以及使用
  • ViewService——一种保证客户端与服务端同步的方法
  • 阿里云前端周刊 - 第 26 期
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • AI算硅基生命吗,为什么?
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #100天计划# 2013年9月29日
  • #HarmonyOS:基础语法
  • #NOIP 2014# day.1 T2 联合权值
  • $.ajax()方法详解
  • $NOIp2018$劝退记
  • (1)STL算法之遍历容器
  • (1)虚拟机的安装与使用,linux系统安装
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法)Game
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (状压dp)uva 10817 Headmaster's Headache
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .net core 6 redis操作类