从关系数据库JPA / Hibernate查询创建JSON对象

时间:2017-12-27 19:16:38

标签: json spring hibernate jpa

我在Spring网络应用程序中使用JPA / Hibernate访问了一个关系数据库。我有很多Ajax查询,其中关系结果需要转换为JSON对象。有没有一个简单的解决方案可以将这样的东西从Relational JPA查询转换为下面的?

enter image description here

结果

[
  { id: event-..782, color: rgba(14,48,71,0.6), startTime : 2017-12-27 00:05, endTime: 2017-12-27 00:25 },
  { id: event-..801, color: rgba(249,115,0,0.6), startTime: 2017-12-27 00:30, endTime: 2017-12-27 00:45 },
  { id: event-..776, color: rgba(255,0,0,0.99), startTime: 2017-12-27 00:00, endTime: 2017-12-27 00:05 },  
  { id: event-..838, color: rgba(255,0,0,0.99), startTime: 2017-12-27 00:25, endTime: 2017-12-27 00:30 }
]

您可以看到,在此示例中,Relational DB返回每个Object 2行,其中Date为StartTimeEndTime(第1行与第2行)。在这里它必须组合成2行的2列。有很多这样的例子,表格数据需要以某种方式按摩成JSON。

我看到的解决方案是

  • 在JPA方面,做一些魔术来按摩/将结果投射到自定义中 对象,但这是非常痛苦的。有时可能会有Native SQL hack,有时则不行。这对我来说似乎不一致和不确定。
  • 在获得“普通”JPA实体后,使用javax.json或GSON等工具手动构建JSON,但人们告诉我这是错误的方法。但即使我走这条路,我也需要2个POJO:一个用于从JPA获取自定义结果(因为我不会获得'真正的'域实体),另一个用于实际的最终JSON表示。

人们如何处理这个问题?他们是否真的调整了JPA / Hibernate,他们是否使用GSON手动填充或其他什么?

注意我们正在使用PostgreSQL 10作为我们的数据库。

1 个答案:

答案 0 :(得分:0)

您可以使用SqlResultSetMapping映射实体@NamedNativeQuery:以您想要的格式获得结果,并将其直接映射到 JSON object,你的查询应该是这样的(取决于你的RDBMS):

Select distinct id_char, color, date starTime,
(Select date from table t2 where t2.id_char=t1.id_cgar and t2.id_int=2) as endTime 
From table t1 where t1.id_int=1

您也可以按原样获得结果,并在应用程序层中使用简单的 POJO 类将其转换为您想要的格式。