JPA - Calendar persistieren?

Status
Nicht offen für weitere Antworten.

megachucky

Bekanntes Mitglied
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

Code:
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...
 
G

Guest

Gast
Versuche das hier. Bei Hibernate funktioniert sowas.
Code:
@NamedQuery(name="getCarsForInspection", query="SELECT c FROM Car c WHERE YEAR(c.generalInspection) > 1995")
 

megachucky

Bekanntes Mitglied
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.
 
G

Guest

Gast
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.
Code:
@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
Code:
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben