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

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

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

1、自定义实体


  1. /**
  2. * Created by administor on 2018-7-18 17:50.
  3. */
  4. public class CarTraceResult {
  5. private String plateNo;
  6. private Integer plateColor;
  7. private String typeName;
  8. private String parkName;
  9. private Calendar time;
  10. private Long times;
  11. public CarTraceResult(String plateNo, Integer plateColor, String typeName, String parkName, Calendar time, Long times) {
  12. this.plateNo = plateNo;
  13. this.plateColor = plateColor;
  14. this.typeName = typeName;
  15. this.parkName = parkName;
  16. this.time = time;
  17. this.times = times;
  18. }
  19. //省略get、set方法
  20. }
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) " +
  2. " from CarTraceRecordEntity a where a.plateNo = ?1 and a.plateColor = ?2 " +
  3. "and a.type = ?3 group by a.parkNo order by time desc ")
  4. List<CarTraceResult> queryCarTraceRecord(String plateNo, Integer plateColor, Integer type);

网友有强调自定义实体类的属性和名称要与查询结果完全对应,那么问题来了,由于我使用了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)) " +
  2. " from CarTraceRecordEntity a where a.plateNo = ?1 and a.plateColor = ?2 " +
  3. "and a.type = ?3 group by a.parkNo order by time desc ")
  4. List<CarTraceResult> queryCarTraceRecord(String plateNo, Integer plateColor, Integer type);

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

总结:

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. Django项目:CRM(客户关系管理系统)--37--29PerfectCRM实现King_admin编辑自定义限制

    #base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— from django.shortcuts import render ...

  2. Centos 设置时区

    参考网址: http://jingyan.baidu.com/article/636f38bb268a82d6b84610bd.html //打开设置 tzselect //选择 )Asia → )c ...

  3. JS---案例:大量字符串拼接效果实现

    案例:大量字符串拼接效果实现 按钮点击,字符串拼接,最后效果字符串,str input有很多,type来分就有button和text,需要找出inputs[i].value是text的 所以用!=&q ...

  4. angular4 自定义表单组件

    自定义表单组件分为单值组件和多值组件. 单值组件:input/select/radio/textarea 多值组件:checkbox/tree组件 条件: 1.必须实现ControlValueAcce ...

  5. python自动化---各类发送邮件方法及其可能的错误

    一.发送文本邮件 可能的问题1.:需要注意,目前QQ邮箱来讲,不能收到完整的邮件,即有些内容不能显示,最好全部使用网易邮箱: 可能的问题2.:在以往的文本邮件发送中,只写了 msg = MIMETex ...

  6. union /union all/ intersect / minus

  7. java根据list中的对象某个属性排序

    1. Collections.sort public class Test { public static void main(String[] args) throws Exception { Ci ...

  8. Mysql 5.7.17安装后登录mysql的教程方法

    在运行 ./bin/mysqld Cinitialize 初始化数据库时,会生成随机密码,示例: [Note] A temporary password is generated for root@l ...

  9. idea展开和折叠方法的快捷键

    Ctrl+"+/-",当前方法展开.折叠 Ctrl+Shift+"+/-",全部展开.折叠

  10. JavaScript的注意事项

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...