0

我正在使用 Helidon 2.0.0-M2。当我运行下面的查询时,我会返回一个 JSON 对象列表。

dbClient.execute(exec -> exec.createNamedQuery("select-dsitem-by-id")
                .addParam("userId", dataItemId)
                .execute())
                .thenAccept(response::send)
                .exceptionally(throwable -> sendError(throwable, response));

返回列表

[
    {
        "data": "qwerty",
        "user_id": "12345"
    },
    {
        "data": "qwerty123",
        "user_id": "22345"
    }
]

属性名称似乎直接取自数据库列名称。例如,返回的一个属性名称是“user_id”。但是,我希望它是“userId”。我还想为此列表创建一个父包装器,例如:

{
    "userList": [
        {
            "data": "qwerty",
            "user_id": "12345"
        },
        {
            "data": "qwerty123",
            "user_id": "22345"
        }
    ]
}

使用 dbclient 执行此操作的最佳方法是什么?

谢谢

4

1 回答 1

2

简单的方法:更改您的 SQL 语句以返回正确的名称,例如: SELECT data, user_id as userId FROM mytable

复杂的方法:我们正在努力为映射到 JSON 流提供更好的支持。目前只有一种(有点复杂)方法可以实现这一点:

您可以创建一个从 aDbRow到的自定义映射器JsonObject。这个映射器需要是一个通用的(它必须适用于DbRow任何查询)。

内置映射器使用列上提供的元数据。我准备了一个简单的例子(只希望有一种类型的语句):

class DbRecordMapperProvider implements DbMapperProvider {
        private static final DbMapper<JsonObject> MAPPER = new DbRecordMapper();
        @SuppressWarnings("unchecked")
        @Override
        public <T> Optional<DbMapper<T>> mapper(Class<T> aClass) {
            if (JsonObject.class.equals(aClass)) {
                return Optional.of((DbMapper<T>)MAPPER);
            }
            return Optional.empty();
        }
    }
    class DbRecordMapper implements DbMapper<JsonObject> {
        @Override
        public JsonObject read(DbRow dbRow) {
            return Json.createObjectBuilder()
                    .add("name", dbRow.column("FIRSTPART").as(String.class))
                    .add("message", dbRow.column("SECONDPART").as(String.class))
                    .build();
        }

        @Override
        public Map<String, ?> toNamedParameters(JsonObject dbRecord) {
            return dbRecord;
        }

        @Override
        public List<?> toIndexedParameters(JsonObject dbRecord) {
            throw new IllegalStateException("Cannot convert json object to indexed parameters");
        }
    }

重要的方法是public JsonObject read(DbRow dbRow)

一旦你有了这样的DbMapperProvider,你就可以在 DbClient 中注册它:

        dbClient = DbClient.builder()
                .config(config.get("db"))
                .mapperProvider(new DbRecordMapperProvider())
                .build();
于 2020-05-13T09:53:34.790 回答