• Spring Data JPA 查询结果返回至自定义实体


    本人在实际工作中使用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

  • 相关阅读:
    类似详情表里面查询最后一次下的订单(以下示例是查找最近一次登陆的记录)
    你真的理解了继承和多态吗?
    尝试了N个版本的Visual C++ 2005后,终于这个Visual C++ 2005 Express Beta 2可以用了。
    [Eclipse笔记]请对Java、Sun、NetBeans、Eclipse感兴趣朋友的看看Eclipse对Sun的心态吧
    [Eclipse笔记]无意中发现Eclipse3.1M7中增加的一项虽然小却很方便的功能
    [Eclipse笔记]Back to the old days Eclipse下的二进制文件编辑器插件EHEP
    [Eclipse笔记]Eclipse3.1M7在Windows下新的内存管理方式
    Is JBuilder dead?
    [Eclipse笔记]SQLExplorer插件试用手记
    [Eclipse笔记]Bug 21493 fixed
  • 原文地址:https://www.cnblogs.com/jpfss/p/11162135.html
Copyright © 2020-2023  润新知