如何构造Hibernate查询以生成时间序列图数据

时间:2011-08-11 16:03:22

标签: sql hibernate hql criteria

存在Hibernate实体

WeatherStatistic  

包含给定时间的大气数据快照。

如果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     |

是否可以编写查询(Criteria / 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,然后输出生成的图形图像。

2 个答案:

答案 0 :(得分:1)

在SQL中,您可以使用union:

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不支持union,但我认为在HQL中没有办法实现它。

您之前也可以使用简单的HQL查询获取Java代码中的数据,构建包含标签,时间和值的Java Bean列表,并将它们用作JRBeanCollectionDataSource

答案 1 :(得分:0)

以为我应该在考虑JB Nizet的建议之后发布我实际提出的解决方案!

我通过编写一个接受HQL查询列表的自定义Jasper-Hibernate数据源解决了这个问题。在引擎盖下,此数据源执行串行查询(有效模拟联合)并将结果连接在一起,以便Jasper可以按顺序访问它们。