Hibernate ORM 本机查询 Json 个带键的对象
Hibernate ORM Native Query to Json Objects with keys
背景
我已经将 Maven 和 Hibernate 设置到了可以使用的程度
@GET
@Path("/test")
@Transactional
public Response test() {
Query query = entityManager.createNativeQuery("select * from some_table");
List<Object[]> result = query.getResultList();
return Response.ok(result).build();
}
当前结果
我现在得到的结果是
[
[1, "Something", "Something else"],
[2, "Another", "Anotherother"],
...
]
想要的结果
这几乎就是我想要的,只是我希望每一行都是一个 Json 对象,其键与列名称相对应。即
[
{"id": 1, "name": "Something", "description": "Something else"},
{"id": 2, "name": "Another", "description": "Anotherother"},
...
]
问题
据我所知,我得到的结果是因为我从 .getResultList()
方法中检索的结果为 List<Object[]>
。大概我必须以某种方式将其作为 List<Map<String, Object>>
获取。
我的方向是否正确,或者我是否需要重新考虑整个方法?
Hibernate 是一个 OR 映射器,但您并没有真正使用它的 OR 功能。如果您只想从 table 生成 JSON,您应该使用数据库提供的任何函数来将行聚合到 JSON 对象数组 JSON。在 PostgreSQL 中你可以使用 select json_agg(row_to_json(t)) from some_table t
简单的答案是您需要使用 DTO 模式。
这样,您就可以向 Jackson 推送一个合适的对象,该对象将使用 属性 名称和值进行序列化。
1.使用 DTO
或
2。使用 2D HashMap 与此
for(Object[] obj : objects){
store(obj[1]);
}
可以使用 ResultTransformer.
完成数据转换
List<JsonObject> l = query.unwrap(org.hibernate.Query.class).setResultTransformer(JsonRT.INSTANCE);
class JsonRT implements ResultTransformer {
public static final JsonRT INSTANCE = new JsonRT();
public Object transformTuple(Object[] tuple, String[] aliases) {
final JsonObject o = new JsonObject();
/* populate object with key/value pair */
return o;
}
}
背景
我已经将 Maven 和 Hibernate 设置到了可以使用的程度
@GET
@Path("/test")
@Transactional
public Response test() {
Query query = entityManager.createNativeQuery("select * from some_table");
List<Object[]> result = query.getResultList();
return Response.ok(result).build();
}
当前结果
我现在得到的结果是
[
[1, "Something", "Something else"],
[2, "Another", "Anotherother"],
...
]
想要的结果
这几乎就是我想要的,只是我希望每一行都是一个 Json 对象,其键与列名称相对应。即
[
{"id": 1, "name": "Something", "description": "Something else"},
{"id": 2, "name": "Another", "description": "Anotherother"},
...
]
问题
据我所知,我得到的结果是因为我从 .getResultList()
方法中检索的结果为 List<Object[]>
。大概我必须以某种方式将其作为 List<Map<String, Object>>
获取。
我的方向是否正确,或者我是否需要重新考虑整个方法?
Hibernate 是一个 OR 映射器,但您并没有真正使用它的 OR 功能。如果您只想从 table 生成 JSON,您应该使用数据库提供的任何函数来将行聚合到 JSON 对象数组 JSON。在 PostgreSQL 中你可以使用 select json_agg(row_to_json(t)) from some_table t
简单的答案是您需要使用 DTO 模式。
这样,您就可以向 Jackson 推送一个合适的对象,该对象将使用 属性 名称和值进行序列化。
1.使用 DTO
或
2。使用 2D HashMap 与此
for(Object[] obj : objects){
store(obj[1]);
}
可以使用 ResultTransformer.
完成数据转换List<JsonObject> l = query.unwrap(org.hibernate.Query.class).setResultTransformer(JsonRT.INSTANCE);
class JsonRT implements ResultTransformer {
public static final JsonRT INSTANCE = new JsonRT();
public Object transformTuple(Object[] tuple, String[] aliases) {
final JsonObject o = new JsonObject();
/* populate object with key/value pair */
return o;
}
}