注解@Query查询结果返回至自定义实体


一般查询结果只返回对应的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);

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

在这里插入图片描述
参考文档:
https://blog.csdn.net/liuyunyihao/article/details/81106799


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM