# JPA - Calendar persistieren?



## megachucky (8. Jun 2007)

Hallo.

Noch eine Frage:

Kann man eigentlich Calendar nicht persistieren? 

Dank folgendem Bug: https://glassfish.dev.java.net/issues/show_bug.cgi?id=353

kann man schonmal gar nicht @Temporal(TemporalType.DATE) zum Attribut hinzufügen...

Auch diese Meldung des Glassfish lässt mich darauf schließen:

cannot navigate expression [c.generalInspection] of type [java.util.Calendar] inside a query


```
Deploying application in domain failed; Deployment Error -- Exception Description: Error compiling the query [getCarsForInspection: SELECT c FROM Car c WHERE c.generalInspection.YEAR > 1500], line 1, column 28: invalid navigation expression [c.generalInspection.YEAR], cannot navigate expression [c.generalInspection] of type [java.util.Calendar] inside a query. Deployment Error -- Exception Description: Error compiling the query [getCarsForInspection: SELECT c FROM Car c WHERE c.generalInspection.YEAR > 1500], line 1, column 28: invalid navigation expression [c.generalInspection.YEAR], cannot navigate expression [c.generalInspection] of type [java.util.Calendar] inside a query.
```


Als Abfrage hatte ich diese hier benutzt, die müsste doch passen, oder?:

@NamedQuery(name="getCarsForInspection", query="SELECT c FROM Car c WHERE c.generalInspection.YEAR > 1995")



Wie speichert man denn am besten ein Datum in einem Entity ab? Die Notlösung wäre natürlich über einzelne Integer, aber das ist ja sicher nicht notwendig, oder?

Danke nochmal für Hilfe...


----------



## Guest (9. Jun 2007)

Versuche das hier. Bei Hibernate funktioniert sowas. 
	
	
	
	





```
@NamedQuery(name="getCarsForInspection", query="SELECT c FROM Car c WHERE YEAR(c.generalInspection) > 1995")
```


----------



## megachucky (9. Jun 2007)

Ok, danke.

Aber habe vorher schon das Problem, dass das Field "Calendar Instanz" ja gar nicht in der Datenbank gespeichert wird.

Daher kann dann natürlich auch die Abfrage nicht funktionieren.

Die Frage ist daher erstmal, wie man Calendar Instanzen überhaupt persistieren kann?
Die Annotation  @Temporal(TemporalType.DATE) bewirkt anscheinend, dass die Instant eben nur temporär vorhanden ist, sie ist aber zwingend erforderlich, sonst kann man die Bean gar nicht deployen.


----------



## Guest (9. Jun 2007)

Das spielt zunächst mal keine Rolle. Calendar wird, genauso wie Date zum Timestamp auf der Datenbank
bzw. zum Typen, den man bei Temporal angegeben hat.

```
@Temporal(TIMESTAMP)
protected java.util.Calendar dday;
```
Die JPA Implementierung muss sowieso die *QL Query in Native SQL übersetzen. Eine Funktion wie YEAR
in QL wird in die entsprechenden Statements des SQL-Dialekts übersetzt.
z.B. bei Oracle könnte es dann wie folgt aussehen
	
	
	
	





```
EXTRACT(YEAR FROM dday) > 1995
```


Übrigens, mach mal paar Zeilenumbrüche in dem Code-Block oben, damit es die Seite hier nicht
so sehr in die Breite zieht.


----------

