2017-12-27 978 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