2015-10-14 45 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