2015-10-14 48 views
1

我做JPQL查询,像这样自定义选择@Query JSON键

@Repository 
@Transactional 
public interface UserFlightDao extends CrudRepository<UserFlight, Long> { 
    @Query("SELECT uf.departureGps, uf.flight.id, uf.flight.flightNumber, uf.flight.airline.name, uf.flight.departureDate, " + 
      "uf.flight.departureAirport.name FROM UserFlight uf WHERE user.id=?1") 
    List<UserFlight> getUserFlights(Long userId); 
} 

UserFlight包含Flight对象,我选择从两个UserFlightFlight对象值,并将其返回给用户的JSON 。

首先,我认为使用List<UserFlight>作为返回类型(即使它有效)是错误的,因为技术上我没有返回完整的UserFlight对象。对?也许我应该切换到List<Object>

第二件事,我希望返回给用户的json包含关键名称。目前我得到的json包含了一组对象,没有它们各自的键名。响应示例:

[ 
    [ 
    "sdf", 
    1, 
    234234, 
    "American Airline", 
    { 
     "dayOfMonth": 13, 
     "dayOfWeek": "TUESDAY", 
     "dayOfYear": 286, 
     "monthValue": 10, 
     "month": "OCTOBER", 
     "year": 2015, 
     "hour": 18, 
     "minute": 41, 
     "nano": 0, 
     "second": 39, 
     "chronology": { 
     "id": "ISO", 
     "calendarType": "iso8601" 
     } 
    }, 
    "dummy airport" 
    ], 
    [ 
    "asfsaf", 
    1, 
    234234, 
    "American Airline", 
    { 
     "dayOfMonth": 13, 
     "dayOfWeek": "TUESDAY", 
     "dayOfYear": 286, 
     "monthValue": 10, 
     "month": "OCTOBER", 
     "year": 2015, 
     "hour": 18, 
     "minute": 41, 
     "nano": 0, 
     "second": 39, 
     "chronology": { 
     "id": "ISO", 
     "calendarType": "iso8601" 
     } 
    }, 
    "dummy airport" 
    ] 
] 

任何想法如何获取关键名称以及值?我应该在从存储库收到List<Object>后手动构建json还是有一个更简单的方法?

这是我怎么称呼getUserFlights

​​

回答

1

如果您只需要列,该UserFlight的子集,您需要创建实体UserFlight的轻型版本,命名为UserFlightLight。为上述查询返回此实体。这可能是一个小工作,但这真的可以帮助您避免您可能看到的返回对象类型的所有其他问题。

+0

感谢您的提示。我创建了一个类来保存你所建议的值(类没有注释,只有列子集的setter/getters),我使用了'SELECT new com.foo.bar.model.UserFlightLight(arg1,arg2..etc) '在jpql查询中,一切都很好。 – prettyvoid