本人在实际工作中使用Spring Data Jpa框架时,一般查询结果只返回对应的Entity实体。但有时根据实际业务,需要进行一些较复杂的查询,比较棘手。虽然在框架上我们可以使用@Query注解执行我们自定义的sql语句,但是其返回值为List<Object[]> 类型,即多个Object数组的List集合,然后通过解析获取需要的数据,比较麻烦。

于是,开始考虑能否将查询结果返回至自定义的实体类,网上寻找解决方案并自己不断实践,遇到一些问题,跟大家分享下。

首先,介绍一种可行的方案:

1、自定义实体

    1. /**
      1. * Created by administor on 2018-7-18 17:50.
        1. */
          1. public class CarTraceResult {
            1. private String plateNo;
              1. private Integer plateColor;
                1. private String typeName;
                  1. private String parkName;
                    1. private Calendar time;
                      1. private Long times;
                          1. public CarTraceResult(String plateNo, Integer plateColor, String typeName, String parkName, Calendar time, Long times) {
                            1. this.plateNo = plateNo;
                              1. this.plateColor = plateColor;
                                1. this.typeName = typeName;
                                  1. this.parkName = parkName;
                                    1. this.time = time;
                                      1. this.times = times;
                                        1. }
                                            1. //省略get、set方法
                                              1. }
                                            1.  
                                            1. CarTraceResult需要实现构造方法,因为后面会用到。

                                            2、查询

                                                1. @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) " +
                                                  1. " from CarTraceRecordEntity a where a.plateNo = ?1 and a.plateColor = ?2 " +
                                                    1. "and a.type = ?3 group by a.parkNo order by time desc ")
                                                      1. List<CarTraceResult> queryCarTraceRecord(String plateNo, Integer plateColor, Integer type);
                                                    1.  

                                                    网友有强调自定义实体类的属性和名称要与查询结果完全对应,那么问题来了,由于我使用了max()和count()函数,并分别将对应结果起了别名,该语句在执行中是报错的。到这里,似乎是无解了。反复尝试后,大胆将代码改为:

                                                      1. @Query(value = "select new com.park.carTrace.pojo.CarTraceResult(a.plateNo, a.plateColor, a.typeName, a.parkName, max(a.time), count(a.id)) " +
                                                        1. " from CarTraceRecordEntity a where a.plateNo = ?1 and a.plateColor = ?2 " +
                                                          1. "and a.type = ?3 group by a.parkNo order by time desc ")
                                                            1. List<CarTraceResult> queryCarTraceRecord(String plateNo, Integer plateColor, Integer type);
                                                          1.  

                                                          去掉了后面两个的别名,结果程序成功执行并返回了结果,如图:

                                                          总结:

                                                          1、查询中CustomModel最好写全路径,程序有可能无法定位到该类。

                                                          2、自定义的实体类属性只需要顺序和数据类型与查询结果对应即可,名字无需一致,当然一般也把名字对应起来方便阅读。

                                                          3、查询结果实际上还是返回的List<Object[]> 类型,只不过是按照数据类型和顺序,对应到自定义的实体里去了。即便如此,该方案也为我们的工作提供了方便。

                                                          最后,希望本文能对需要的朋友有所帮助,不足之处请斧正。

                                                          原文地址:https://blog.csdn.net/liuyunyihao/article/details/81106799

                                                          Spring Data JPA 查询结果返回至自定义实体的更多相关文章

                                                          1. spring data jpa查询部分字段、多余附加字段

                                                            spring data jpa查询部分字段 第一种方法:使用 model 查询时转化 首先建立一个 model ,写上自己想要查询的字段,然后写上构造函数,这步很重要,因为spring jpa 转化时 ...

                                                          2. spring data jpa 查询部分字段列名无效问题

                                                            spring data jpa原生sql查询问题,我只要表其中的几个字段的值,本以为写个原生sql,拿实体类对象去接没问题 结果列名无效,测试了一下,把返回值类型改成List<Object> ...

                                                          3. spring boot系列(五)spring boot 配置spring data jpa (查询方法)

                                                            接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...

                                                          4. 在Spring Data JPA 中使用Update Query更新实体类

                                                            对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ...

                                                          5. Spring Data Jpa 查询返回自定义对象

                                                            转载请注明出处:http://www.wangyongkui.com/java-jpa-query. 今天使用Jpa遇到一个问题,发现查询多个字段时返回对象不能自动转换成自定义对象.代码如下: //U ...

                                                          6. spring data jpa 查询自定义字段,转换为自定义实体

                                                            目标:查询数据库中的字段,然后转换成 JSON 格式的数据,返回前台. 环境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 背景:首先建立 ...

                                                          7. Spring Data JPA查询指定列,并返回实体(改)

                                                            现有PostEntiy实力,包含各种属性,如: /** * @Auther: DingShuo * @Date: 2018/7/18 11:09 * @Description: */ @Entity ...

                                                          8. spring data jpa 查询No property ... found for...Did you mean '...'?

                                                            原文地址:https://blog.csdn.net/earthhour/article/details/79271816 实体类字段定义: private String sku_no; dao中接口 ...

                                                          9. Spring Data JPA 查询

                                                            1 按照关键字方法名查询 自定义的简单查询就是根据方法名来自动生成SQL,主要的语法是findBy,readABy,queryBy,getBy,countBy后面跟属性名称 findBy,readAB ...

                                                          随机推荐

                                                          1. 【python之路23】递归

                                                            1.递归的基础 举例说明:老师要班里坐在最后的一排学生要一本书,老师对前面的人说你向最后一排的同学要一本书,那么最前面的人跟坐在第2排的人说,第2排的人跟第3排的人说,当命令传递到最后一排时,最后一排 ...

                                                          2. Hackerrank--XOR love (Math系列)

                                                            题目链接 Devendra loves the XOR operation very much which is denoted by ∧ sign in most of the programmin ...

                                                          3. spring JdbcTemplate最基本的使用

                                                            package com.com.jdbctemplate; import org.springframework.jdbc.core.JdbcTemplate; import org.springfr ...

                                                          4. docker-4-Dockerfile配置文件详解

                                                            ​ Dockerfile简单一点就是描述你这个镜像安装了哪些软件包,有哪些操作,创建了什么东西.有些人喜欢用 docker commit 命令去打包镜像,这样是不好的,首先commit出来的镜像比你使 ...

                                                          5. 数据库安全 (ch.4)

                                                            4.2.4 授权与回收 使用 Grant 授予权限 使用Revoke 回收权限 Grant [权限] ON *.. to * [with grant option] with grant option ...

                                                          6. mysql8下载安装及配置

                                                            mysql8下载和安装 一.下载 官网地址:https://dev.mysql.com/downloads/mysql/8.0.html 选择“downloads”-->"mysql ...

                                                          7. 2019-10-18-WPF-解决-StylusPlugIn-点击穿透问题

                                                            title author date CreateTime categories WPF 解决 StylusPlugIn 点击穿透问题 lindexi 2019-10-18 20:55:35 +0800 ...

                                                          8. 洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]

                                                            P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...

                                                          9. windows无法启动MySQL服务报错1067的解决方法是怎样?

                                                            方法一: 1.打开my.ini文件,找到default-storage-engine=InnoDB这一行,把它改成default-storage-engine=MyISAM.2.删除在MySQL安装目 ...

                                                          10. 【二次元的CSS】—— 用 DIV + CSS3 画咸蛋超人(详解步骤)

                                                            [二次元的CSS]—— 用 DIV + CSS3 画咸蛋超人(详解步骤) 2016-05-17 HTML5cn 仅仅使用div作为身体的布局,用css3的各种transform和圆角属性来绘制各部位的 ...