У меня есть класс обслуживания, как показано ниже:
public class RulesService {
@PersistenceContext
private EntityManager em;
public JSONArray getReportingTableData(String Query) {
List<Object> list = em.createNativeQuery(Query).getResultList();
return /*convert the above list as json array**/;
}
}
Итак, если запрос: «выберите col1 как имя, col2 как agefrom table1», тогда мой jsonArray должен быть
[{"name":"test","age":"24"},{"name":"test1","age":"26"}]
Я не хочу использовать здесь pojo или класс сущности, потому что запрос будет меняться динамически, и здесь много таблиц, поэтому я не хочу создавать отдельный класс java для каждой таблицы. Это причина, по которой я пытаюсь чтобы сделать его как JSONArray.
Может ли кто-нибудь дать мне правильное решение.
Я не думаю, что ваш getResultList сработает. Он возвращает List <Object []>
Вы также можете использовать SQL-вызовы для получения желаемых данных. Они гибкие.
@HadiJ Я пробовал это, поскольку Пратхамеш Джагтап сказал, что getResultList возвращает List <Object []>. Поэтому я не могу получить его как пару ключ-значение. Это просто дает массив значений
"age:26" должен быть "age":"26"Я отредактировал это спасибо @HadiJ
Вы пробовали использовать ObjectMapper, который я написал в качестве ответа?
@HadiJ Как я сказал ранее, я не могу получить список результатов в виде пары ключ-значение. Это похоже на [["test", "24"], ["test2", "26"]
если у вас есть список массивов и вы хотите преобразовать его в key/value, вы можете сделать вот так. List<Map<String,String>> result = list.stream() .map(arr->{ Map<String,String> map = new HashMap<>(); map.put("name",arr[0]); map.put("age",arr[1]); return map; }).collect(Collectors.toList());




Вы могли сделать это с помощью ObjectMapper Джексона. Этот руководство очень интересен.
List<Object> list = em.createNativeQuery(Query).getResultList();
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(out, list);
final byte[] data = out.toByteArray();
System.out.println(new String(data));
вы можете использовать ObjectMapper для динамического выполнения.
public JSONArray getReportingTableData(String Query) {
List<Object> list = em.createNativeQuery(Query).getResultList();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
String arrayToJson = objectMapper.writeValueAsString(list);
JSONArray array = new JSONArray(arrayToJson);
return /*convert the above list as json array**/;
}
Он преобразует мой список <Object> в jsonArray, но мой запрос не возвращает его как пару ключ-значение.
заменить em.createNativeQuery (Query); в Map <String, Object> resultMap = em.createNativeQuery (Query, Map.class) .getResultList ();
Можете ли вы поделиться запросом mysql
Думаю, ты хочешь поступить так, как показано ниже. Результатом вашего запроса является список массивов. [["test","24"],["test2","26"]], и вы хотите преобразовать его в key-value
List<Map<String,String>> result = listOfarray.stream()
.map(arr->{
Map<String,String> map = new HashMap<>();
map.put("name",arr[0]);
map.put("age",arr[1]);
return map;
})
.collect(Collectors.toList());
Как я уже сообщал ранее, запрос является динамическим, имя столбца для каждого запроса также может измениться. Не удастся получить имя столбца во время обработки.
У вас может быть метод, который дает результат запроса и имя столбца. затем преобразуйте его, как вы видите в моем ответе.
почему не использовали
List<Map<String,Integer>>?