Отображение столбцов jsonb в модель java с использованием rowMapper - PullRequest
0 голосов
/ 25 февраля 2020

В моей базе данных есть несколько столбцов jsonb. Я использую PostgreSQL например

CREATE TABLE trades (  
  id serial NOT NULL, 
  accounts jsonb,
  //..
  //..
);

Мне нужно сопоставить эти jsonb столбцы с моей моделью данных, используя Spring RowMapper mapRow():

public class DataModelRowMapper implements RowMapper<TestModel> {


    @Override
    public TestModel mapRow(final ResultSet rs,
                                 final int rowNum) throws SQLException {

        List<Account> accounts = jsonParser.parse(rs.getString("accounts"), new TypeReference<List<Account>>() {
        });

        //other jsonb columns



        Account account = accounts.stream()
                                                    .filter(account -> account.getType() == Type.CLIENT)
                                                    .findFirst()
                                                    .orElse(new Account());


        final TestModel testModel = new TestModel();
        testModel.setId(rs.getString("id"));
        testModel.setAccountName(account.getName());


        return testModel;
    }

}

Внутри mapRow() Я анализирую json в Java List, а затем перебираю поток, чтобы найти соответствующее значение, так как возвращаются несколько accounts. У меня есть несколько дополнительных столбцов jsonb, для которых я выполняю аналогичные операции внутри mapRow().

Раньше я возвращал точные значения из самого запроса SQL, который оказался медленным, а затем переместил логи фильтрации c внутрь mapRow() в java коде, поскольку намерение состоит в том, чтобы повысить производительность и вернуть результат.

У меня вопрос, должен ли я анализировать и фильтровать логи c внутри mapRow? Есть ли более быстрый способ загрузки jsonb данных и сопоставления со TestModel accountName строковым свойством?

Моя проблема в том, что запрос sql выполняется быстро <1 мс на БД, но слой java добавляет некоторые издержки. </p>

1 Ответ

0 голосов
/ 25 февраля 2020

Если вы посмотрите на всю систему, вам, возможно, вообще не понадобится разбирать поля. например, в большинстве случаев требуется вернуть JSON без изменений. просто верните строку. не нужно разбирать туда-сюда, это действительно быстрее.

пример весны mvc:

// a method that returns a list of objects in JSON by search criteria
        @RequestMapping(value = "/getAll", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE, consumes =  MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody
        void getAll(HttpServletResponse response, @RequestBody final Entity request) throws IOException {
            List<String> res = null;
            try {
                List<Entity>  regList =  entityDAO.getAll(request); // get from DB list of objects with JSON
                res = regList.stream().map(h -> h.getJson_obj()).collect(Collectors.toList()); // just collect JSONs
    //            res = regList.stream().map(h -> h.getJson_obj().replaceFirst("\\{", "{ \"vehicle_num\":" + h.getVehicle_num() + ",")).collect(Collectors.toList()); //it is also possible to add dynamic data without parsing
            } catch (Exception e) {
                logger.error("getAll ", e);
            }

            String resStr = "[" + res.stream().filter(t -> t != null).collect(Collectors.joining(", ")) + "]"; // join in one String

            response.setHeader("Content-Type", "application/json;charset=UTF-8"); 
            response.setStatus(200);
            response.getWriter().println(resStr);
        }

ps извините, я не могу оставить комментарий, поэтому ответ.

...