有两个月没更新过CSDN了,裸辞了,半个月前刚入职了新下家,这里适应下新公司的项目技术。

持久层用的是之前没用过的jpa,还好平时多多少少也有学过,上手也快。

用jpa写原生sql的时候,真的想骂人,各种问题。可是jsql又不支持sql的一些函数,只能写原生sql。

这里就先记录第一个坑,用jpa注解查询完之后发现无法用以往的实体类直接映射接收,百度谷歌无果...

这里实在没办法,用了个笨办法,将结果集用工具类转成实体类再返回。


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author 954L* @create 2019/10/30 17:27*/
public class EntityUtils {/*** 将数组数据转换为实体类* 此处数组元素的顺序必须与实体类构造函数中的属性顺序一致** @param list  数组对象集合* @param clazz 实体类* @param <T>   实体类* @param model 实例化的实体类* @return 实体类集合*/public static <T> List<T> castEntity(List<Object[]> list, Class<T> clazz, Object model) {List<T> returnList = new ArrayList<T>();if (list.isEmpty()) return returnList;Object[] co = list.get(0);List<Map> attributeInfoList = getFiledsInfo(model);Class[] c2 = new Class[attributeInfoList.size()];if (attributeInfoList.size() != co.length) {return returnList;}for (int i = 0; i < attributeInfoList.size(); i++) {c2[i] = (Class) attributeInfoList.get(i).get("type");}try {for (Object[] o : list) {Constructor<T> constructor = clazz.getConstructor(c2);returnList.add(constructor.newInstance(o));}} catch (Exception ex) {return returnList;}return returnList;}private static Object getFieldValueByName(String fieldName, Object modle) {try {String firstLetter = fieldName.substring(0, 1).toUpperCase();String getter = "get" + firstLetter + fieldName.substring(1);Method method = modle.getClass().getMethod(getter, new Class[]{});Object value = method.invoke(modle, new Object[]{});return value;} catch (Exception e) {return null;}}private static List<Map> getFiledsInfo(Object model) {Field[] fields = model.getClass().getDeclaredFields();List<Map> list = new ArrayList(fields.length);Map infoMap = null;for (int i = 0; i < fields.length; i++) {infoMap = new HashMap(3);infoMap.put("type", fields[i].getType());infoMap.put("name", fields[i].getName());infoMap.put("value", getFieldValueByName(fields[i].getName(), model));list.add(infoMap);}return list;}}
    @Query(value = "select ID as id, ITEM_NAME as itemName, IS_SORT as isSort from SPF_OT_TAX_ITEM " +"WHERE PARENT_ID = :parentId", nativeQuery = true)List<Object[]> queryTaxItemVOByParentId(@Param("parentId") String parentId);
@Overridepublic List<TaxItem.TaxItemVO> queryTaxItemVOByParentId(String parentId) {List<Object[]> objects = taxItemRepository.queryTaxItemVOByParentId(parentId);return EntityUtils.castEntity(objects, TaxItem.TaxItemVO.class, new TaxItem.TaxItemVO());}
public static class TaxItemVO{private String id;private String itemName;private Integer isSort;public TaxItemVO() {super();}public TaxItemVO(String id, String itemName, Integer isSort) {this.id = id;this.itemName = itemName;this.isSort = isSort;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getItemName() {return itemName;}public void setItemName(String itemName) {this.itemName = itemName;}public Integer getIsSort() {return isSort;}public void setIsSort(Integer isSort) {this.isSort = isSort;}}

对你有帮助的话,右上角给个赞呗~

JPA原生sql返回值转自定义实体类相关推荐

  1. JPA多表关联查询,自定义实体类接收返回的结果集

    在项目中使用jpa进行多表连接查询,基本上返回的都是多张表中的数据.那么问题来了,这关联返回的数据那么多,还是不同表当中的数据,数据库中也没有表和它对应啊,怎么处理呢?返回Object吗 1.教师类 ...

  2. jpa 原生sql 查询返回一个实体_JPA查询--使用原生sql 并且把查询结果转为实体对象...

    这篇文章主要记录 使用原生sql查询 并且把查询结果转为实体对象, 注意:这儿使用的数据库 是oracle数据库 这儿记录了三种查询:精确查询,模糊查询,分页查询. 1.把原生sql查询的结果转为实体 ...

  3. 掌握 ASP.NET 之路:自定义实体类简介

    发布日期 : 5/24/2005| 更新日期 : 5/24/2005 Karl Seguin Microsoft Corporation 摘要:有些情况下,非类型化的 DataSet 可能并非数据操作 ...

  4. 掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn

    ADODB.RecordSet 和常常被遗忘的 MoveNext 的时代已经过去,取而代之的是 Microsoft ADO.NET 强大而又灵活的功能.我们的新武器就是 System.Data 名称空 ...

  5. java调用sql返回list_Hibernate执行原生SQL返回ListMap类型结果集

    我是学java出身的,web是我主要一块: 在做项目的时候最让人别扭的就是hibernate查询大都是查询出List(T指代对应实体类)类型 如果这时候我用的联合查询,那么返回都就是List , 这样 ...

  6. 专题---自定义实体类

    目录 一.概述 二.项目初始化 2.1 创建空解决方案 2.2 DBX操作 2.2.1 创建DBX 2.2.2 调试DBX 2.2.3 创建实体类 2.2.4 调试实体类 2.3 ARX操作 2.3. ...

  7. jpa 原生sql 查询返回一个实体_spring data系列之jpa

    Springdata 系列之spring data jpa 背景:随着互联网技术的发展,现在的企业开发中用到的用于数据存储的产品,不再仅仅是关系型数据库,而是要根据场景需要选择不同的存储技术,比如用于 ...

  8. 008_Spring Data JPA原生SQL

    1. nativeQuery默认的是false, 表示不开启sql查询.表示是否对value中的语句做转义.使用原生sql, 需要开启它. 2. 原生sql中使用的是表名,这要和JPQL语句中使用的是 ...

  9. executeupdate mysql_executeUpdate(sql) 返回值是什么?

    展开全部 executeUpdate(sql) 的返回值是一个整数(int). 当executeUpdate(sql)是INSERT.UPDATE 或 DELETE 语句时e69da5e6ba9062 ...

最新文章

  1. 选择最合适的预测性维护传感器
  2. [Issue Fixed]-Pulse r9.1 embedded browser install failure
  3. 【hadoop】20.MapReduce-InputFormat数据切片机制
  4. php html采集,php file_get_contents函数轻松采集html数据
  5. Hibernate----Hibernate小配置
  6. Linux安装MySQL的完整步骤并有关MySQL8.0版本的问题方法
  7. 2017.3.19 约数个数和 失败总结
  8. react native 组件汇总整理,点击链接至GitHub
  9. PGM:图模型学习概述
  10. python 装饰器常见场景与用法
  11. ES6学习笔记八(数值的扩展)
  12. java 加密使长度变短
  13. WPF从零到1教程详解,适合新手上路
  14. TrueCrypt 密码找回工具
  15. 海量监控视频如何存储?
  16. MATLAB代码:基于分布式优化的多产消者非合作博弈能量共享
  17. 人肉搜索、人肉语言及人肉程序设计
  18. Node+puppeteer学习笔记(三)--API问题解决--切换frame和iframe框
  19. quic client的数据发送流程
  20. win10计算机属性管理打不开,win10无法打开设置应用的两种解决方法【图文】

热门文章

  1. 【密码学】轻松理解“加盐”的原理与java实现
  2. 智能安全帽价格多少?什么品牌好?
  3. Java进阶学习第十六天(Struts框架:配置、数据处理、自动封装、日期类型转换、文件上传)
  4. electron-builder 设置用户可以自己选择安装目录
  5. 连续包周服务协议 Continuous Week Subscription Agreement
  6. 《C语言到底能干什么》1.5 在窗口上写上“Hello World”(高手莫看)
  7. [THUPC2017] 天天爱射击(整体二分+树状数组)
  8. FireFox火狐浏览器登录EBS
  9. ERP与CRM集成经验
  10. 飞行模式到底管用吗?