SpringBoot + Hibernate + Restful:格式响应

时间:2017-12-12 16:30:42

标签: hibernate rest api spring-boot

我是Hibernate的新手,并尝试创建一个将返回当前位置的API。 所以在DaoImpl中我写了一个查询

public List<Location> getCurrentLocation() {

    return sessionFactory.getCurrentSession().createQuery("select l.employee.id, max(l.locationTime) as currentTime, l.longtitude , l.latitude,l.date from Location l group by l.employee.id").list();
}

在控制器中

@RequestMapping(value = "currentLocation", method = RequestMethod.GET)
    public ResponseEntity<List<Location>> getCurrentLocation() {
        List<Location> location;
        try {
            location = locationService.getCurrentLocation();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return new ResponseEntity<List<Location>>(HttpStatus.NO_CONTENT);
        }
        return new ResponseEntity<List<Location>>(location, HttpStatus.OK);
    }

当我调用该API时,我会收到此回复

[[11,"07:30:00",106.634756,10.826307,"2017-11-23"],[15,"07:00:00",106.632142,10.826456,"2017-11-24"]] 我只是想问为什么我不能得到属性名称。我还是不明白。 有没有人可以解释这个,我怎样才能获得属性名称 例如['employeename':11,'time':"07:30:00",'longtitude':106.634756,'latitude':10.826307,'workday':"2017-11-23"] 请帮帮我

1 个答案:

答案 0 :(得分:0)

这很简单:你使用像l.employee.id这样的投影。

对于此查询

select loc from Location loc

from Location(相同的简短版本)

Hibernate返回List<Location>,但是当你开始使用投影时,Hibernate会返回List<Object[]>。你有这个列表作为回应。

list()只返回一个List(非通用),因此您有一个未经检查的转化

List<Object[]> -> List<Location>

你能做什么

  1. 使用转换器将查询结果转换为Map,并从端点返回Map

  2. 使用其他变换器添加课程LocationDto并将结果映射到DTO列表。

  3. 在查询中直接使用some.package.LocaitionDto构造函数(请不要忘记包)(how does the new keyword in hql work?)。

  4. 请不要忘记为每个投影添加别名。

    Spring Hibernate get selected columns

    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to className

    How to transform a flat result set using Hibernate