Преобразовать List
Я хочу записать результат выполнения sql запроса в List.
Вот мой код:
@PersistenceContext
private EntityManager em;
@RequestMapping( "/statistics")
public @ResponseBody
List<Object> statisticsMethod(
) {
//EntityManager em = emf.createEntityManager();
List<Object> results = em.createNativeQuery("select 'restaurant', rest.name from \n" +
"tables tab\n" +
"left join orders ord\n" +
"on ord.table_id=tab.id\n" +
"left join restaurants rest\n" +
"on rest.id=tab.restaurant_id\n" +
"\twhere ord.begin_time>=DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')\n" +
"\t\t\t\t and ord.begin_time<=DATE_TRUNC('month', CURRENT_DATE + INTERVAL '1 month - 1 day')\n" +
"\t\t\t\t group by rest.name\n" +
"\t\t\t\t order by count(tab.restaurant_id) desc\n" +
"\t\t\t\t limit 4;").getResultList();
return results;
}
Результат этого метода следующий JSON:
[
[
"restaurant",
"Torro Grill Воронеж"
],
[
"restaurant",
"Балаган Сити"
],
[
"restaurant",
"Платонов"
],
[
"restaurant",
"Старый город"
]
]
Но я хочу чтобы JSON выглядел так:
[
{"restaurant":"Torro Grill Воронеж"},
{"restaurant":"Балаган Сити"},
{"restaurant":"Платонов"},
{"restaurant":"Старый город"},
]
Подскажите, пожалуйста, как этого добиться.
Ответы (2 шт):
Автор решения: alex
→ Ссылка
Можно сделать через кастомный сериализатор.
Создадим модель получаемых данных:
@JsonSerialize(using = MySerializer.class)
public class Model{
List<Object> list;
public Model(List<Object> list){
this.list = list;
}
}
Реализуем сериализатор:
public class MySerializer extends JsonSerializer<Model>{
public MySerializer() {
}
@Override
public void serialize(Model model, JsonGenerator gen, SerializerProvider serializers) throws IOException {
List<Object> value = model.list;
gen.writeStartArray();
value.forEach(it ->{
try {
gen.writeStartObject();
String[] arr = (String[]) it;
gen.writeFieldName(arr[0]);
gen.writeString(arr[1]);
gen.writeEndObject();
}catch (IOException e){
e.printStackTrace();
}
});
gen.writeEndArray();
}
}
Поменяем тип возвращаемого значения:
Model statisticsMethod(){
List<Object> results = em.createNativeQuery(------
return new Model(results);
}
Автор решения: Aziz Umarov
→ Ссылка
Вообще-то так не делается, Вы пытаетесь сохранить объект в json, при этом объект это запись в таблице. По результату у Вас 2 поля со значениями, а вы хотите 1. смотрите случай когда SELECT rest.name AS restaurant FROM ....