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