Spring Data JPA 查询结果返回至自定义实体
Spring 查询 自定义 Data 返回 结果 实体 jpa
2023-09-27 14:24:46 时间
本人在实际工作中使用Spring Data Jpa框架时,一般查询结果只返回对应的Entity实体。但有时根据实际业务,需要进行一些较复杂的查询,比较棘手。虽然在框架上我们可以使用@Query注解执行我们自定义的sql语句,但是其返回值为List<Object[]> 类型,即多个Object数组的List集合,然后通过解析获取需要的数据,比较麻烦。
于是,开始考虑能否将查询结果返回至自定义的实体类,网上寻找解决方案并自己不断实践,遇到一些问题,跟大家分享下。
首先,介绍一种可行的方案:
1、自定义实体
- /**
- * Created by administor on 2018-7-18 17:50.
- */
- public class CarTraceResult {
- private String plateNo;
- private Integer plateColor;
- private String typeName;
- private String parkName;
- private Calendar time;
- private Long times;
-
- public CarTraceResult(String plateNo, Integer plateColor, String typeName, String parkName, Calendar time, Long times) {
- this.plateNo = plateNo;
- this.plateColor = plateColor;
- this.typeName = typeName;
- this.parkName = parkName;
- this.time = time;
- this.times = times;
- }
-
- //省略get、set方法
- }
CarTraceResult需要实现构造方法,因为后面会用到。
2、查询
-
- @Query(value = "select new com.park.carTrace.pojo.CarTraceResult(a.plateNo, a.plateColor, a.typeName, a.parkName, max(a.time) as time, count(a.id) as times) " +
- " from CarTraceRecordEntity a where a.plateNo = ?1 and a.plateColor = ?2 " +
- "and a.type = ?3 group by a.parkNo order by time desc ")
- List<CarTraceResult> queryCarTraceRecord(String plateNo, Integer plateColor, Integer type);
网友有强调自定义实体类的属性和名称要与查询结果完全对应,那么问题来了,由于我使用了max()和count()函数,并分别将对应结果起了别名,该语句在执行中是报错的。到这里,似乎是无解了。反复尝试后,大胆将代码改为:
- @Query(value = "select new com.park.carTrace.pojo.CarTraceResult(a.plateNo, a.plateColor, a.typeName, a.parkName, max(a.time), count(a.id)) " +
- " from CarTraceRecordEntity a where a.plateNo = ?1 and a.plateColor = ?2 " +
- "and a.type = ?3 group by a.parkNo order by time desc ")
- List<CarTraceResult> queryCarTraceRecord(String plateNo, Integer plateColor, Integer type);
去掉了后面两个的别名,结果程序成功执行并返回了结果,如图:
总结:
1、查询中CustomModel最好写全路径,程序有可能无法定位到该类。
2、自定义的实体类属性只需要顺序和数据类型与查询结果对应即可,名字无需一致,当然一般也把名字对应起来方便阅读。
3、查询结果实际上还是返回的List<Object[]> 类型,只不过是按照数据类型和顺序,对应到自定义的实体里去了。即便如此,该方案也为我们的工作提供了方便。
最后,希望本文能对需要的朋友有所帮助,不足之处请斧正。
原文地址:https://blog.csdn.net/liuyunyihao/article/details/81106799
相关文章
- Spring事务在单元测试中的应用
- 基于Struts2、Spring、Hibernate实现的包括多条件查询分页的基础Dao层帮助jar包实现
- 2022 最新 Spring Boot 面试题 (一)
- Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
- Spring Cloud Gateway-自定义异常处理
- 从理论走向实战!阿里高工熬夜整理出的 Spring 源码速成笔记太香了
- Spring源码之构造函数实例化Bean(九)
- Spring Boot 配置中的敏感信息如何保护?
- Spring Boot 的2020最后一击:2.4.1、2.3.7、2.2.12 发布
- 《Servlet、JSP和Spring MVC初学指南》——1.8 GenericServlet
- spring的context---ServletContext WebApplicationContext---Spring各种上下文的关系详解
- spring框架漏洞整理(Spring Boot Actuator相关漏洞)
- Spring Boot用Cxf的jax-ws开发WebService
- spring aop 环绕通知around和其他通知的区别
- 全栈开发实战|电子商务平台的设计与实现(Spring Boot + MyBatis + Thymeleaf)
- Spring Boot 2 + Thymeleaf:表单字段绑定、表单提交处理
- spring boot 2使用Mybatis多表关联查询
- Spring data JPA只查询部分字段问题
- Cross Site Request Forgery (CSRF)--spring security -转
- Spring面向切面编程(AOP)方式二