存在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,然后输出生成的图形图像。
答案 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可以按顺序访问它们。