Как построить запрос Hibernate для генерации данных графика временных рядов - PullRequest
0 голосов
/ 11 августа 2011

Существует сущность Hibernate

WeatherStatistic  

, которая содержит моментальные снимки атмосферных данных в определенные моменты времени.

Если в WeatherStatistic было только 1 тип измерения атмосферы, например.температура:

| 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

Если это можно сделать, то можно ли обеспечить гибкость, позволяющую извлекать любую комбинацию значений полей, то есть: либо температуру, либо влажность, либо и то и другое?

Данные должны использоваться для динамической генерации графиков временных рядов.Я работаю с источником данных Hibernate для Jasper, который принимает строку запроса HQL и передает результаты запроса непосредственно в Jasper, который затем выводит сгенерированные графические изображения.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

В 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 Beans, содержащий метку, время и значение, и использовать их как JRBeanCollectionDataSource .

0 голосов
/ 11 ноября 2011

Думаю, что я должен опубликовать решение, которое я действительно придумал после рассмотрения предложений JB Nizet!

Я решил проблему, написав собственный источник данных Jasper-Hibernate, который принимает список запросов HQL. Изнутри этот источник данных выполняет запросы последовательно (эффективно имитируя объединение) и объединяет результаты вместе, чтобы Jasper мог обращаться к ним последовательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...