SpringBoot JPA实践之EntityManage查询返回自定义DTO

2023-05-16

 

 

在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现,JPA提供的多数查询均以返回Entity居多,它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象(这与@Query注解查询返回接口结果集相似),本篇文章围绕不使用任何Entity与对象级联配置的情况,将原生SQL查询的结果集转换为自定义DTO对象。

参考代码

package cn.chendd.example.jpa.user.dao;

/**
 * @author chendd
 * @date 2020/5/5 22:26
 */

@Repository
@Transactional(readOnly = true)
public class UserQueryCustomResultDao {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Map<String , Object>> nativeSqlQuery2Map() {
        String sql = "select 7 age , 3.1415 pi , name userName , createTime createTime " +
                " from user a where a.name = ?";
        NativeQueryImpl query = entityManager.createNativeQuery(sql).unwrap(NativeQueryImpl.class);
        query.setParameter(1, "chendd");
        query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List<Map<String, Object>> resultList = query.getResultList();
        return resultList;
    }

    public List<UserResultDto> nativeSqlQuery2Bean() {
        String sql = "select idname userName , createTime , 3.1415 pi , 100.00 amount , 1 status" +
                " from user a where a.name = ?";
        NativeQueryImpl query = entityManager.createNativeQuery(sql).unwrap(NativeQueryImpl.class);
        query.setResultTransformer(Transformers.aliasToBean(UserResultDto.class));
        query.setParameter(1, "chendd");
        query.addScalar("id", StandardBasicTypes.STRING);
        query.addScalar("userName", StandardBasicTypes.STRING);
        query.addScalar("createTime", StandardBasicTypes.TIMESTAMP);
        query.addScalar("pi", StandardBasicTypes.DOUBLE);
        query.addScalar("amount", StandardBasicTypes.BIG_DECIMAL);
        /*query.addScalar("status", StandardBasicTypes.NUMERIC_BOOLEAN);*/
        
query.addScalar("status" , StandardBasicTypes.BOOLEAN);
        List<UserResultDto> resultList = query.getResultList();
        return resultList;
    }

}

代码剖析

(1)核心查询使用EntityManager对象的createNativeQuery方法实现;

(2)unwrap函数可以构建多种多样的类型,使用返回NativeQueryImpl的实现类进行SQL查询,当前类或方法的事物必须为只读,只有设置了事物Transactional为只读时,才可正常范围该实现类,否则返回为Proxy类;

(3)Transformers.ALIAS_TO_ENTITY_MAP将集合泛型类型转换为Map类型,默认为Array类型;

(4)Transformers.aliasToBean指定查询集合泛型类型为自定义DTO类型,但必须设置所有参数对应的StandardBasicTypes对应类型;

(5)getResultList、list返回为List类型,singleResult返回为单条数据对象,几乎所有的框架组件实现在查询返回为Map(Single)类型结构的时候需要保证数据可以查询到,并且查询到仅为1条,否则抛出异常;

@2020/10/27

经过稍微深入一些的案例分析(以oracle为例),发现上述代码函数“nativeSqlQuery2Bean”中的处理字段别名映射部分,可以不通过addScalar函数去设置需要映射的字段参数类型,如果了解的话(或者是明确的话)直接将参数列绑定到一个普通的DTO对象中的某个属性字段上。

注意:

(1)当SQL语句有select 1 "a" , 2 "c" from dual这种时,由于当前查询的dual是一个虚拟数据,理论上讲这里查询的数据库中的数字类型number一律映射为DTO中的BigDecimal类型,无论数据库中返回的是否包含小数点之类的。

(2)不使用addScalar指定时,必须严格根据字段类型的限制,否则会报错;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot JPA实践之EntityManage查询返回自定义DTO 的相关文章

随机推荐

  • SwiftUI 如何让文本自动支持查找和替换功能?

    概览 有些情况下 xff0c 我们需要为文本编辑器实现文本的查找和替换功能 xff08 find amp replace xff09 xff0c 如果完全靠自已撸码还是比较棘手的 所幸的是 xff0c 从 SwiftUI 4 0 xff08
  • SwiftUI 新 Alert 弹出窗口圆你文本输入之梦

    概览 小伙伴们都知道 xff0c 弹出 Alert 不能包含文本输入框是 SwiftUI 的阿喀琉斯之踵 Achilles Heel 当然 xff0c 这说的有些夸张了 x1f609 不过 xff0c Alert 不能包含 TextFiel
  • SwiftUI 4.0 新 LabeledContent 视图帮您解决所有对齐烦恼

    概览 在用 SwiftUI Form 设计 App 界面时 xff0c 最头疼的就是内部视图对齐的问题了 好不容易适配了 iOS 中的布局 xff0c 到了 iPadOS 或 MacOS 上却变得一团糟 有没有一劳永逸 xff0c 简单方便
  • Xcode 使用 Instruments 无法找到代码中耗时挂起操作的解决

    问题现象 Instruments 是一套非常有用的代码分析和调试利器 我们经常用它来查找 App 中的性能瓶颈 不过 有时 Instruments 却无法捕获到系统明显挂起或长耗时的方法 这是怎么回事呢 如上图所示 App 运行中系统 Se
  • 用 DISM 命令备份与还原 Windows 系统

    一 初始备份 xff08 例如 xff1a 把 C 分区的系统备份到 D 分区的 Win8BF 文件夹中 xff0c 备份文件名为 Win8Pro wim xff09 xff1a Dism Capture Image ImageFile D
  • Unresolved reference: viewModels,viewModels()方法找不到

    遇到的问题 最近在学习LiveData和ViewModel xff0c 跟着官网敲 xff0c 碰到了以下情况 span class token keyword private span span class token keyword v
  • 天干地支计算

    年的干支 方法一 xff1a 首先要能记住十大天干和十二地支 xff0c 十天干 xff1a 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 xff1b 十二地支 xff1a 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 xff1b 天干地支纪年
  • 程序员们,AI来了,机会来了,危机也来了

    程序员们 xff0c AI来了 xff0c 机会来了 xff0c 危机也来了 1 人工智能真的来了 纵观古今 xff0c 很少有计算机技术能有较长的发展寿命 xff0c 大部分昙花一现 xff0c 比如 xff1a 昔日的DOS windo
  • 统信UOS 20 1050 记录一次openssl升级失败的排查过程

    目录 不能找到openssl最新版本的原因 fedora有相关module的介绍 一些yum module 常用的命令 xff1a 查看yum module 都有哪些 启用禁用module 总结 xff1a 后记 xff1a 通过yum l
  • iOS之富文本

    之前做项目时遇到一个问题 xff1a 使用UITextView显示一段电影的简介 xff0c 由于字数比较多 xff0c 所以字体设置的很小 xff0c 行间距和段间距也很小 xff0c 一大段文字挤在一起看起来很别扭 xff0c 想要把行
  • JetBrains IntelliJ IDEA 2022.2 使用 Java 17 运行时

    JetBrains 发布 了 IntelliJ IDEA 2022 2 xff0c 支持 Java 17 和最新的语言和框架 xff0c 如 Scala Kotlin Spring 6 和 Spring Boot 3 这个新版本使用了 Je
  • Linux生产者消费者模型实现

    转载请注明出处 xff1a https blog csdn net mymottoissh article details 84181224 任何语言提及到多线程同步都离不开生产者 消费者模型 这也是针对许多现实问题建模用到的基础模型 这一
  • 使用CMD启动JAR后,出现定时器不执行问题

    SpringBoot项目中 使用了 64 Scheduled注解开启一个定时任务 在windows系统启动时 开始输出正常 当执行到输出控制台日志时 有时候会直接卡住线程不执行了 查了一圈发现是CMD的快速编辑引起的线程阻塞 解决办法 1
  • Flink开发中遇到的问题及解法

    1 当Source是Kafka的时候 xff0c 如何设置Source Operator的并发度 xff1f 如果没有指定 xff0c Source Operator的个数与集群中的TaskManager的个数相等 如果手动设置 xff0c
  • vue初学者代码格式报错

    报错内容 xff1a Do not use built in or reserved HTML elements as component id header
  • Ubuntu 设置su密码

    在使用su命令获取超级权限的时候提示输入密码 xff0c 在安装ubuntu的时候只设置了用户密码 xff0c 没记得有其他密码 这里需要给root用户重新设置密码 xff1a sudo passwd 然后输入密码即可
  • Spark MLlib学习(二)——分类和回归

    MLlib支持多种分类方法 xff0c 如二分类 多分类和回归分析等 问题类型 支持的方法 二分类 线性SVM 逻辑回归 xff0c 决策树 xff0c 随机森林 xff0c GBDT xff0c 朴素贝叶斯 多分类 决策树 xff0c 随
  • 关于onNewIntent你应该知道的

    一 API描述如下 大概意思是当Activity被设以singleTop模式启动 xff0c 当需要再次响应此Activity启动需求时 xff0c 会复用栈顶的已有Activity xff0c 还会调用onNewIntent方法 并且 x
  • 程序猿的情话

    世界上最遥远的距离 xff0c 是我在if里你在else里 xff0c 似乎一直相伴又永远分离 xff1b 世界上最痴心的等待 xff0c 是我当case你是switch xff0c 或许永远都选不上自己 xff1b 世界上最真情的相依 x
  • SpringBoot JPA实践之EntityManage查询返回自定义DTO

    在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现 xff0c JPA提供的多数查询均以返回Entity居多 xff0c 它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象 xff08 这与