# JPQL Query für eine Tabellenansicht



## talen (22. Apr 2009)

Hallo zusammen,
Ich kriege es irgendwie nicht hin eine bestimmte JPQL Query zu erstellen. Ich habe eine Tabelle/Klasse MeasuringParameter und eine Tabelle/Klasse MeasuringValue.
MeasuringValue hat die Felder id(int), measuringParameter(MeasuringParameter), value(Double) und date(Date). MeasuringParameter hat die Felder id(int) und name(String).

MeasuringParameter sind Messparameter welche definiert sind. MeasuringValue enthält die Messwerte die zum jeweiligen Messparameter gehören. Nun will ich eine Query erstellen welche mir für einen bestimmten Zeitraum die Messwerte bestimmter Messparameter ausgibt. Die Ausgabe sollte folgendermassen aussehen:


```
Datum | Messparameter1 | Messparameter2 ...
01.01.2008 00:00 | 19.87 | 42.11 ...
01.01.2008 00:01 | 21.43 | 46.21 ...
```

Die Zeilen sollten angezeigt werden, sobald einer der Messparameter einen Eintrag darin hat. es kann durchaus sein, dass eine Zeile nur Daten von einem Messparameter hat, die anderen Spalten sollen dann NULL haben.

Ich habe mal ein bisschen herumprobiert, aber ich komm nicht weiter. Hier meine Testquery.


```
select mv.date, mv8, mv1, mv21 from 
MeasuringValue mv, 
(select mvi8.value from MeasuringValue mvi8 where mvi8.date=mv.date and mvi8.measuringParameter.id=8) mv8, 
(select mvi1.value from MeasuringValue mvi1 where mvi1.date=mv.date and mvi1.measuringParameter.id=1) mv1, 
(select mvi21.value from MeasuringValue mvi21 where mvi21.date=mv.date and mvi21.measuringParameter.id=21) mv21 
where 
(mv.measuringParameter.id=8 or mv.measuringParameter.id=1 or mv.measuringParameter.id=21 ) 
and mv.date between :start and :end
order by mv.date asc
```

ps: Wenn man einen select auf die Klasse/Tabelle MeasuringValue macht und nach date und measuringparameter.id abfragt, kriegt man höchstens ein ergebnis.


----------



## talen (22. Apr 2009)

Ich habe etwas weitergepröbelt. Es funktioniert jetzt solange beide Messparameter zu den selben Zeitpunkten Messdaten haben. Wenn ich jetzt aber einen Messparameter habe der alle Stunden einen Messwert holt, und einen anderen der alle halbe Stunde einen holt, geht die Query nicht. Dann werden nur die Stunden angezeigt. Beispiel: Messparameter A hat immer um xx.00 Uhr Daten und Messparameter B um xx.00 und xx.30. Die Ausgabe ist dann wie folgt:


```
Datum | A | B
01:00 | 20.01 | 30.12
02:00 | 21.21 | 30.34
```
Ich will aber, dass es so aussieht:

```
Datum | A | B
01:00 | 20.01 | 30.12
01:30 | NULL  | 31.01
02:00 | 21.21 | 30.34
02:30 | NULL  | 32.15
```
Hier meine aktuelle Version:


```
SELECT 
 
mv.date, mv5.value, mv1.value 
 
FROM 
 
MeasuringValue mv, MeasuringValue mv5, MeasuringValue mv1 
 
WHERE 
 
(mv.measuringParameter.id=5 OR mv.measuringParameter.id=1 ) 
 
AND mv5.date BETWEEN :start AND :end 
AND mv5.measuringParameter.id=5 
AND mv5.date=mv.date 
 
AND mv1.date BETWEEN :start AND :end 
AND mv1.measuringParameter.id=1 
AND mv1.date=mv.date 
 
AND mv.date BETWEEN :start AND :end 
 
ORDER BY mv.date
```


----------



## talen (23. Apr 2009)

Ich habe nun eine Lösung mit einer Native SQL Query implementiert. Falls jemand darauf kommt, wie man das mit JPQL lösen könnte, bitte posten. Würde mich wunder nehmen.

Hier die Lösung:


```
select 
mv.date, mv5.value, mv1.value 
from 
MeasuringValue mv 
left outer join 
(select * from MeasuringValue mvi5 where mvi5.measuringParameter_id=1) mv5 
on (
mv.date=mv5.date and 
mv5.measuringValueCalculation_id=mv.measuringValueCalculation_id and 
mv5.measuringValueStep_id=mv.measuringValueStep_id) 
left outer join 
(select * from MeasuringValue mvi1 where mvi1.measuringParameter_id=1) mv1 
on (
mv.date=mv1.date and 
mv1.measuringValueCalculation_id=mv.measuringValueCalculation_id and 
mv1.measuringValueStep_id=mv.measuringValueStep_id)  
where 
(mv.measuringParameter_id=5 or mv.measuringParameter_id=1) and 
mv.measuringValueCalculation_id=:measuringValueCalculationId and 
mv.measuringValueStep_id=:measuringValueStepId and 
mv.date between :start and :end 
order by mv.date asc
```


----------

