当前位置: 首页 > 知识库问答 >
问题:

使用rowMapper将jsonb列映射到java模型

韦知
2023-03-14

我的数据库表有几个jsonb列。

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

我需要使用SpringRowMappermapRow()将这些jsonb列映射到我的数据模型:

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列表,然后在返回多个帐户时通过流式处理找到合适的值。我还有几个额外的jsonb列,我在mapRow()中对这些列执行类似的操作。

之前,我从SQL查询本身返回了精确的值,这被证明很慢,然后在java代码中将这个过滤逻辑移到了mapRow()内部,目的是提高性能并返回结果。

我的问题是,我应该在mapRow中解析和过滤逻辑吗?有没有更好更快的方法加载jsonb数据并映射到TestModelaccountName字符串属性?

我的问题是,sql查询运行得很快


共有1个答案

董新觉
2023-03-14

如果查看整个系统,可能根本不需要解析字段。例如,在大多数情况下,需要返回JSON而不进行修改。把绳子还给我。不需要来回解析,它真的更快。

例如Springmvc:

// 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);
        }

抱歉,我不能留下评论,所以请回答。

 类似资料:
  • 问题内容: 我们有一张有很多列的大桌子。移至MySQL Cluster后,由于以下原因无法创建表: 错误1118(42000):行大小太大。不包括BLOB在内的已使用表类型的最大行大小为14000。这包括存储开销,请查阅手册。您必须将某些列更改为TEXT或BLOB 举个例子: 这是用于存储配置参数的表。我在想,我们可以将一些列合并为一个列,并将其存储为JSON对象,然后将其转换为Java对象。 例

  • 在对这个话题进行了大量的测试和研究之后,我无法完全解决我的问题。我正在springboot应用程序中使用modelmapper进行实体/DTO映射。我正在尝试配置modelmapper,将一个集合映射到一个简单的DTO对象。我已经创建了一个自定义转换器,它正在按预期工作: 我现在的问题是将此转换器应用于所有“集合”= 如果我直接在模型映射器中添加转换器,它就是不工作。 你对此有什么提示或解决办法吗

  • 问题内容: 我在这里有一个复杂的json 我正在尝试在我的模型类“ ChromeJsonModel”中映射它,例如: 但是我收到以下错误。 我为什么会在哪里出问题? 问题答案: 您拥有非常复杂的有效负载,其中相同的属性可能具有一个或多个对象。默认情况下不会处理这种情况,因此我们需要为此类属性实现自定义反序列化器。下面我创建了代表您的有效负载的简单模型: 如您所见,它是-es属性。让我们为这些属性实

  • 当我尝试将一个名为someKPIObject对象的KPI实例添加到Mongodb时,使用 我得到以下错误: 警告:参数化类型被视为非类型化对象。请参见类KPI org.mongodb.morphia.mapping.mapping.mapping.mapping.mapper.todbobject(mapper.java:984)在org.mongodb.morphia.mapping.mappe

  • 问题内容: 我需要将obj 映射到一个类及其中的数组,并且它也应该具有所有子级数据。(也嵌套数组列表),我需要再次将更新的数据列表转换为 我的json字符串是 问题答案: 首先, 您需要创建要在其中映射JSON的类。 幸运的是,有一个网站,可以为你做它在这里 其次,您可以使用Google Gson库进行轻松映射 1.添加 依赖项 。 2.从您的对象到JSON。 3.从JSON到object。 有关

  • 我知道如何变换