场景介绍

有时候用JPA的时候,想拥有mybatis如此轻松的映射,将一堆复杂场景的sql语句映射到一个java类来返回。而JPA本身是很坑的,Query之支持简单查询,复杂查询需要去构造Specification来进行复杂查询。但是=。=
我就不!!!我就要用Query进行复杂查询。来吧,ShowTime。

首先,介绍一下场景,就是有这么一个接口,参数是传入窗口号和状态,查询排队的队列。主表是一个叫做check_queue的表,需要关联wicket窗口表,facility设备表,check_register检查用户信息表。通过一个复杂的sql来查询出要的数据并展示出来,表结构就不贴出来,但是通过sql就可以体会大概的条件和场景。

数据查询预览

SELECT c.id, c.createtime, c.lastupdatetime, c.check_Wicket, c.facility_num, c.check_num, c.status, f.facility_name, r.name AS check_name
FROM check_queue cLEFT JOIN wicket w ON c.check_Wicket = w.check_WicketLEFT JOIN facility f ON f.facility_num = w.facility_numLEFT JOIN check_register rON r.check_num = c.check_numAND date_format(r.lastupdatetime, '%y-%m-%d') = date_format(now(), '%y-%m-%d')
WHERE c.check_Wicket = 1AND c.status = 0AND date_format(c.lastupdatetime, '%y-%m-%d') = date_format(now(), '%y-%m-%d')
ORDER BY c.lastupdatetime ASC

可以看到有个条件是AND date_format(r.lastupdatetime, ‘%y-%m-%d’) = date_format(now(),
‘%y-%m-%d’)
,这个是mysql是查询今天的。

然后可以看到主表只有c.id, c.createtime, c.lastupdatetime, c.check_Wicket, c.facility_num, c.check_num, c.status,其他两个字段f.facility_name, r.name AS check_name是来自关联的表。

JPA常规查询并返回

之前的文章,介绍了用JPA进行关联查询并返回到一个接口类上面去,我还是用了这个方法作为前奏。具体可以看之前的文章,用一个interface来接收JPA返回的结果。
https://blog.csdn.net/moshowgame/article/details/80058270

 public interface QueueList {String getCheckName();String getFacilityName();int getId();String getCheckNum();String getCheckWicket();Timestamp getCreatetime();String getFacilityNum();Timestamp getLastupdatetime();String getStatus();
}

那么如果直接用JPA的Query查询,返回的数据是

{"errorCode": "00","errorMessage": "操作成功","returnObject": [{"createtime": 1526358195000,"id": 49,"lastupdatetime": 1526358195000,"status": "2","target": {"createtime": 1526358195000,"lastupdatetime": 1526358195000,"check_Wicket": "1","facility_name": "血压测量","facility_Num": "C3","id": 49,"status": "2","check_name": "小汤154","check_Num": "BY185201805140001"},"targetClass": "org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap"}]
}

显示targetClass是个org.springframework.data.jpa.repository.query.AbstractJpaQueryTupleConverterTupleConverterTupleConverterTupleBackedMap的东西。这一开始是让我很绝望的。

封装处理

好了, 接下来,核心的地方来了。
这个是JPA映射的entity类,那两个关联的facilityName和checkName,非数据库的字段要加@Transient注解

@Entity
@Table(name="check_queue")
@NamedQuery(name="CheckQueue.findAll", query="SELECT c FROM CheckQueue c")
public class CheckQueue implements Serializable {private static final long serialVersionUID = 1L;@Idprivate int id;private String checkNum;private String checkWicket;private Timestamp createtime;private String facilityNum;private Timestamp lastupdatetime;private String status;@Transient   private String facilityName;@Transient   private String checkName;
}

这里要吐槽,JPA最傻的地方,就是不给你映射到这个类上面去,这才导致下文的曲线救国。如果可以,早就迎刃而解了。

那我们在Controller里面这么处理一下:

 /*** 排队队列*/@GetMapping("/queue/{checkWicket}/{status}")public ApiReturnObject findQueue(@PathVariable String checkWicket,@PathVariable String status) {if (StringUtils.isBlank(checkWicket)|| StringUtils.isBlank(status)) {return ApiReturnUtil.error("操作失败,窗口号不能为空");}else {//####请注意,前方核心封装,请勿错过###//获取队列,映射到interface查询类上   List<QueueList> findQueue = lineQueueRepository.queryQueueList(checkWicket, status);//回迁到新的主数据list上List<CheckQueue> dataQueue = new ArrayList<CheckQueue>();for (QueueList item:findQueue) {//先把interface类的内容格式化为string,就是一些属性,然后target里面才是主数据String jsonStr=JSON.toJSONString(item);//格式化string为JSONObject,方便获取target属性JSONObject obj=JSON.parseObject(jsonStr);//从将QueueList的target的数据真正格式化到主数据类CheckQueueCheckQueue data=JSON.toJavaObject(JSON.parseObject(obj.getString("target")), CheckQueue.class);//添加到listdataQueue.add(data);data=null;}//用这个可以返回一个TupleBackedMap类型的我们写的interface//return ApiReturnUtil.success("操作成功",findQueue);//用这个可以返回我们封装的数据,请看下面封装后的效果return ApiReturnUtil.success("操作成功",dataQueue);}      }

下面请看本次封装后的结果。噔噔噔噔。

{"errorCode": "00","errorMessage": "操作成功","returnObject": [{"checkName": "小汤154","checkNum": "BY185201805140001","checkWicket": "1","createtime": 1526358195000,"facilityName": "血压测量","facilityNum": "C3","id": 49,"lastupdatetime": 1526358195000,"status": "2"}]
}

后言

经过后来的摸索,其实如果只是为了返回JSON,也可以直接在Repository层直接用List<Map<String,Object>>来返回,并不需要这么折腾,这里纯属瞎折腾,但是思路确实有那么一点点借鉴的意义吧。

SprigData-JPA之Query进行复杂查询并映射到自定对象(非数据库字段用@Transient注解)相关推荐

  1. java 实体类中增加非数据库字段,同时兼容mybatis-puls与jpa

    原先项目使用的是 jpa + mybatis 来做持久层 ,jpa做增删改操作,mybatis做查,后来发现mybatis-puls也挺香的然后就把puls放了进来. 遇到的问题: 在实体类中加非数据 ...

  2. [转]对于非数据库字段的查询过滤以及app_query.append的用法

    在Form中在查询的记录不希望某些记录显示出来,例如不需要供应商A被显示出来,假设供应商A是数据库项,可以使用 set_block_property('block_name', DEFAULT_WHE ...

  3. JPA Native Query(本地查询)及查询结果转换

    Native Query ,本地查询, 是直接使用SQL语句进行查询,使用本地查询可以不需要查询整张表的字段, 而根据需要进行查询, 那么如何将查询的结果转换成需要的对象类型呢? 且看本篇说来. 本篇 ...

  4. java实体中文字段_java - Spring JPA实体类是否可以包含不在数据库表中的非数据库字段 - SO中文参考 - www.soinside.com...

    我在SpringBoot中使用Spring JPA和Spring Data Rest.我有一个称为用户的数据库表和该表的实体.我没有此应用程序的控制器.@Entity @Table(name = &q ...

  5. MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段

    mybatis plus忽略映射字段时可以在实体类属性上使用以下注解: @TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的. @TableField(e ...

  6. jpa中使用Query判断条件查询

    jpa中使用Query判断条件查询 @Query(value = " select m.* from mining_area as m " +" where 1 = 1& ...

  7. jpa多表联查动态_Spring Data JPA 连表动态条件查询

    多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现(使用较为复杂,查询不够灵活),第二种是使用原生sql查询. JPA原生SQL连表查询 @Rep ...

  8. mongorepository查询条件_springboot jpa + mongodb实现多条件查询数据

    问题一:单条件查询如何查? 问题二:非IBaseMongoRepository接口原生的方法,采用自定义仓库? 问题三:如何结合jpa和mogodb语句从mogodb数据库查询出数据? 解决问题一: ...

  9. Spring Data JPA 之 @Query 语法详解及其应用

    5 Spring Data JPA 之 @Query 语法详解及其应用 5.1 快速体验 @Query 的方法 沿⽤我们之前的例⼦,新增⼀个 @Query 的⽅法: // 通过 query 注解根据 ...

最新文章

  1. python元组(tuple)使用示例+常用方法+列表(list)和元组(tuple)的异同?
  2. 题目1095:2的幂次方
  3. CNN的卷积运算为何使用互相关而不是卷积
  4. 14、mysql中事务的应用
  5. openstack placement 组件作用理解
  6. MAC OSX在视图port哪个程序占用,杀死进程的方法
  7. python搭建webapi_怎么搭建Web Api
  8. 如何运行从github拉取的vue项目
  9. nginx 作为Web缓存服务器
  10. iOS录音、播放、WAV以及caf转成MP3上传后台
  11. SqList *L 和 SqList * L的区别
  12. pandas求协方差、相关系数、显著性检验
  13. php批量百万微信模板消息,PHP实现快速推送微信模板消息
  14. 推荐几个很实用的编程网站
  15. jquery——淡入淡出(fadein与fadeout)
  16. ad7606中文资料_AD7606
  17. win2003 服务器设置 完全版 作者:冰盾防火墙
  18. android 什么是有权查看使用情况的应用程序
  19. HTML5+CSS大作业——个人博客-功能齐全(48页) html大学生网站开发实践作业
  20. 微信小程序绘制二维码

热门文章

  1. 常见web安全漏洞介绍
  2. 计算机的心智:操作系统之哲学原理 pdf电子书
  3. 星三角降压数控启动接线图
  4. “简历造假,面试坦白”如果你是面试官给过吗?
  5. 浅析WPhone、Android的Back与Home键
  6. 计算机组装人员的职责,装配技术员岗位的基本职责
  7. 分配单元大小是什么意思(分配单元大小)
  8. Linux下安装.bin软件的一些问题
  9. pdf 转换格式txt,doc工具 免费
  10. MySQL闪回-binlog2sql