如何使用Helidon 2.0.0-M-2更改查询返回的JSON
我用的是直升机2.0.0-M2。 当我运行下面的查询时,我得到一个JSON对象列表如何使用Helidon 2.0.0-M-2更改查询返回的JSON,helidon,Helidon,我用的是直升机2.0.0-M2。 当我运行下面的查询时,我得到一个JSON对象列表 dbClient.execute(exec -> exec.createNamedQuery("select-dsitem-by-id") .addParam("userId", dataItemId) .execute()) .thenAccept(response::send)
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"
}
]
属性名称似乎直接取自数据库列名。e、 g.返回的一个属性名称是“user\u id”。但是,我希望它是“userId”。我还想为该列表创建一个父包装,如:
{
"userList": [
{
"data": "qwerty",
"user_id": "12345"
},
{
"data": "qwerty123",
"user_id": "22345"
}
]
}
使用dbclient执行此操作的最佳方法是什么
感谢简单的方法:
更改SQL语句以返回正确的名称,例如:
从mytable中选择数据、用户id作为用户id
复杂的方法:
我们正在致力于更好地支持映射到JSON流。
目前只有一种(有点复杂)方法可以实现这一点:
您可以从DbRow
到JsonObject
创建自定义映射器。此映射器必须是通用映射器(它必须适用于任何查询的任何DbRow
)
内置映射器使用列上提供的元数据。我准备了一个简单的示例(只希望有一种类型的语句):
类DbRecordMapperProvider实现DbMapperProvider{
private static final DbMapper MAPPER=new DbRecordMapper();
@抑制警告(“未选中”)
@凌驾
公共可选映射器(类aClass){
if(JsonObject.class.equals(aClass)){
返回可选的.of((DbMapper)映射器);
}
返回可选的.empty();
}
}
类DbRecordMapper实现DbMapper{
@凌驾
公共JsonObject读取(DbRow DbRow){
返回Json.createObjectBuilder()
.add(“name”,dbRow.column(“FIRSTPART”).as(String.class))
.add(“message”,dbRow.column(“SECONDPART”).as(String.class))
.build();
}
@凌驾
公共映射到NamedParameters(JsonObject dbRecord){
返回数据库记录;
}
@凌驾
索引参数的公共列表(JsonObject dbRecord){
抛出新的IllegalStateException(“无法将json对象转换为索引参数”);
}
}
重要的方法是publicjsonobjectread(DbRow-DbRow)
一旦有了这样一个dbapperprovider
,就可以在DbClient中注册它:
dbClient=dbClient.builder()
.config(config.get(“db”))
.mapperProvider(新的DbRecordMapperProvider())
.build();
简单方法:
更改SQL语句以返回正确的名称,例如:
从mytable中选择数据、用户id作为用户id
复杂的方法:
我们正在致力于更好地支持映射到JSON流。
目前只有一种(有点复杂)方法可以实现这一点:
您可以从DbRow
到JsonObject
创建自定义映射器。此映射器必须是通用映射器(它必须适用于任何查询的任何DbRow
)
内置映射器使用列上提供的元数据。我准备了一个简单的示例(只希望有一种类型的语句):
类DbRecordMapperProvider实现DbMapperProvider{
private static final DbMapper MAPPER=new DbRecordMapper();
@抑制警告(“未选中”)
@凌驾
公共可选映射器(类aClass){
if(JsonObject.class.equals(aClass)){
返回可选的.of((DbMapper)映射器);
}
返回可选的.empty();
}
}
类DbRecordMapper实现DbMapper{
@凌驾
公共JsonObject读取(DbRow DbRow){
返回Json.createObjectBuilder()
.add(“name”,dbRow.column(“FIRSTPART”).as(String.class))
.add(“message”,dbRow.column(“SECONDPART”).as(String.class))
.build();
}
@凌驾
公共映射到NamedParameters(JsonObject dbRecord){
返回数据库记录;
}
@凌驾
索引参数的公共列表(JsonObject dbRecord){
抛出新的IllegalStateException(“无法将json对象转换为索引参数”);
}
}
重要的方法是publicjsonobjectread(DbRow-DbRow)
一旦有了这样一个dbapperprovider
,就可以在DbClient中注册它:
dbClient=dbClient.builder()
.config(config.get(“db”))
.mapperProvider(新的DbRecordMapperProvider())
.build();
selectdsitem by idquery是什么样子的?这是一个简单的select语句“selectuser\u id,type,data FROM data\u store WHERE user\u id=:userId”这是一个简单的select语句“selectuser\u id,type,data FROM data\u store WHERE user\u id=:userId”谢谢。SQL语句目前是最简单的。可以用其他JSON(如命名数组)包装输出?谢谢。SQL语句目前是最简单的。是否可以用其他JSON(如命名数组)包装输出?