2015-10-14 3 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 объект, я выбираю значения из обоих UserFlight и Flight объектов и вернуть их пользователю в формате 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" 
    ] 
] 

Любая идея, как получить ключевые имена вместе со значениями? Должен ли я создать json вручную после полученияиз репозитория или есть более простой способ?

Это, как я называю getUserFlights

@RequestMapping(value = "/user_flights", method = RequestMethod.POST) List<UserFlight> getUserFlights() { 
     return userFlightDao.getUserFlights(new Long(1)); 
    } 

ответ

1

Если вам нужно только подмножество столбцов, что и в UserFlight, вам необходимо создать более легкую версию Entity UserFlight, назовите его UserFlightLight. Верните этот объект для указанного выше запроса. Это может быть небольшая работа, но это действительно поможет вам избежать всех других проблем, которые могут возникнуть при возврате типа объекта.

+0

Спасибо за подсказку. Я создал класс для хранения значений, как вы предложили (класс не имеет аннотаций, только сеттеры/геттеры для подмножества столбцов), и я использовал 'SELECT new com.foo.bar.model.UserFlightLight (arg1, arg2..etc) 'в запросе jpql, и все хорошо. – prettyvoid