Получение jsonArray с помощью собственного диспетчера сущностей запросов

У меня есть класс обслуживания, как показано ниже:

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.

Может ли кто-нибудь дать мне правильное решение.

почему не использовали List<Map<String,Integer>>?

Hadi J 18.05.2018 09:06

Я не думаю, что ваш getResultList сработает. Он возвращает List <Object []>

Prathamesh Jagtap 18.05.2018 09:11

Вы также можете использовать SQL-вызовы для получения желаемых данных. Они гибкие.

Flying Dutchman 18.05.2018 09:11

@HadiJ Я пробовал это, поскольку Пратхамеш Джагтап сказал, что getResultList возвращает List <Object []>. Поэтому я не могу получить его как пару ключ-значение. Это просто дает массив значений

kaviya .P 18.05.2018 09:20
"age:26" должен быть "age":"26"
Hadi J 18.05.2018 09:21

Я отредактировал это спасибо @HadiJ

kaviya .P 18.05.2018 09:24

Вы пробовали использовать ObjectMapper, который я написал в качестве ответа?

Hadi J 18.05.2018 09:26

@HadiJ Как я сказал ранее, я не могу получить список результатов в виде пары ключ-значение. Это похоже на [["test", "24"], ["test2", "26"]

kaviya .P 18.05.2018 09:34

если у вас есть список массивов и вы хотите преобразовать его в 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());

Hadi J 18.05.2018 09:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
2 548
3

Ответы 3

Вы могли сделать это с помощью 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, но мой запрос не возвращает его как пару ключ-значение.

kaviya .P 18.05.2018 10:36

заменить em.createNativeQuery (Query); в Map <String, Object> resultMap = em.createNativeQuery (Query, Map.class) .getResultList ();

Devratna 18.05.2018 13:42

Можете ли вы поделиться запросом mysql

Devratna 18.05.2018 13:45

Думаю, ты хочешь поступить так, как показано ниже. Результатом вашего запроса является список массивов. [["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());

Как я уже сообщал ранее, запрос является динамическим, имя столбца для каждого запроса также может измениться. Не удастся получить имя столбца во время обработки.

kaviya .P 18.05.2018 10:41

У вас может быть метод, который дает результат запроса и имя столбца. затем преобразуйте его, как вы видите в моем ответе.

Hadi J 18.05.2018 10:48

Другие вопросы по теме