2017-12-27 1376 views
1

我在Spring Web应用程序中使用JPA/Hibernate访问关系数据库。我有很多Ajax查询需要将关系结果转换为JSON对象。是否有一个简单的解决方案将这样的内容从关系JPA查询转换为下面的内容?从关系数据库JPA/Hibernate查询中创建JSON对象

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

你可以看到,在这个例子中,关系数据库回来了每个对象的2行,其中的日期或者是StartTimeEndTime(行1对2) 。这里它必须合并为2行的2列。有很多像这样的例子,其中表格数据需要以某种方式按到JSON中。

我看到的解决方案是

  • 在JPA方面,做了一些神奇的按摩/项目成果转化为定制 对象,但是这是非常痛苦的。有时候可能会出现原生SQL破解,有时候可能不会。这对我来说似乎不一致和不确定。
  • 在获得“普通”JPA实体后,使用手动JSON构建工具(如javax.json或GSON),但是人们告诉我这是错误的方法。但即使我走这条路,我需要2个POJO:一个用于从JPA获取自定义结果(因为我不会获得'真实'域实体),另一个用于实际的最终JSON表示。

人们如何处理这个问题?他们真的调整JPA /休眠,他们使用手动人口与GSON,还是别的?

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

+0

目前尚不清楚具体问题。这是什么意思,数据库回来2结果?显示代码。无论如何,使用正确的工具来达到它设计的目的:JPA用于表示db对象并查询它们,json库用于将对象转换为json表示形式。顺便说一句,你为什么不使用整数来表示rgba颜色? – perissf

+0

在这种情况下,每个对象信息条目有2行。第1行是StartTime(日期值),第2行是EndTime(日期值)。 –

+0

你的标签说你正在使用Spring。 Spring MVC使用Jackson自动生成JSON:https://spring.io/guides/gs/rest-service/ –

回答

0

您可以使用SqlResultSetMapping映射实体@NamedNativeQuery:确切地得到结果,你想要的格式,并直接将其映射到JSON对象,查询应该是这样的(取决于你的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类的格式。

+0

因此对于提示#2,你说可以使用For-Loop顺序扫描每一行并构建一个POJO - 也就是说,对于同一个事件,检查它何时发生变化,然后手动设置字段?因为我得到了一个抱怨,说这太可怕了,应该避免手动处理。 –

+0

不,我说当然,这样的操作(使用for循环和处理从应用程序层中的数据库中获得的总体结果)可能会对用于应用程序的内存产生负面影响,它的性能 – jfun