2011-08-11 25 views
0

存在一個Hibernate的實體如何構建生成時間序列圖數據

WeatherStatistic 

包含大氣數據的快照在給定時間一個Hibernate查詢。

如果WeatherStatistic只有一種類型的大氣測量,例如。溫度:

| time | temperature | 
-------- ------------- 
| 09:00 | 10  | 
| 10:00 | 20  | 
| 11:00 | 15  | 

然後,我可以寫一個HQL查詢:

select 'temperature' time temperature from WeatherStatistic 

這將返回

'temperature' 09:00 10 
'temperature' 10:00 20 
'temperature' 11:00 15 

的第一列是一個字符串文字,隨後的列是時間和溫度值。

如果表如下:

| time | temperature | humidity | 
-------- ------------- ---------- 
| 09:00 | 10  | 20  | 
| 10:00 | 20  | 15  | 
| 11:00 | 15  | 30  | 

是否可以編寫一個查詢(標準/ HQL/SQL)產生下面的結果?

'temperature' 09:00 10 
'temperature' 10:00 20 
'temperature' 11:00 15 
'humidity'  09:00 20 
'humidity'  10:00 15 
'humidity'  11:00 30 

如果這是可以做到,它是然後可以提供靈活性,允許字段值的任何組合被拉出,即:或者溫度或溼度,或兩者兼而有之?

該數據將用於動態生成時間序列圖。我正在使用Jasper的Hibernate數據源,它接收HQL查詢字符串並將查詢結果直接提交給Jasper,然後輸出生成的圖形圖像。

回答

1

在SQL中,你可以使用一個聯盟:

select * from 
    (select 'temperature' as label, time, temperatureas value from weatherstatistic 
    union 
    select 'humidity' as label, time, humidity as value from weatherstatistic) 
order by label, time 

你將不得不將它傳遞給JasperReports的前動態構造此查詢。

由於HQL不支持聯合,但我沒有看到在HQL中實現它的方法。

您還可以在使用Java代碼之前(使用簡單的HQL查詢)獲取數據,構建一個包含標籤,時間和值的Java Bean列表,並將它們用作JRBeanCollectionDataSource

0

想到我應該在考慮JB Nizet的建議後發佈我實際提出的解決方案!

我通過編寫一個定製的Jasper-Hibernate數據源來解決這個問題,該數據源接受一個HQL查詢列表。在這個引擎下,這個數據源串行執行查詢(有效地模擬聯合)並將結果連接在一起,以便Jasper可以順序訪問它們。