Aus der Dokumentation , speichert Morphia (standardmäßig) keine Null/Leer-Werte, also die Abfrage
query.and(
query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null)
);
wird nicht funktionieren, da es scheint, dass Sie nicht auf null abfragen können, aber Sie können nach einem bestimmten Wert abfragen.
Da Sie jedoch nur einen bestimmten Wert abfragen können, können Sie eine Problemumgehung entwickeln, bei der Sie das createdDate
aktualisieren können Feld mit einem Datumswert, der nie in Ihrem Modell verwendet wird. Wenn Sie beispielsweise ein Date-Objekt mit 0 initialisieren, wird es auf den Beginn der Epoche gesetzt, den 1. Januar 1970 00:00:00 UTC. Die Stunden, die Sie erhalten, sind der lokalisierte Zeitversatz. Es reicht aus, wenn Ihr Update nur das Ändern der übereinstimmenden Elemente in der Mongo-Shell beinhaltet, daher würde es ähnlich wie folgt aussehen:
db.users.update(
{"createdDate": null },
{ "$set": {"createdDate": new Date(0)} }
)
Sie können dann die Fluent-Oberfläche verwenden um diesen bestimmten Wert abzufragen:
Query<User> query = mongoDataStore
.find(User.class)
.field("createdDate").exists()
.field("createdDate").hasThisOne(new Date(0));
Beim Definieren Ihres Modells wäre es viel einfacher, eine prePersist-Methode einzuschließen, die das Feld createdDate aktualisiert. Die Methode ist mit dem @PrePersist
gekennzeichnet Anmerkung, damit das Datum auf der Bestellung gesetzt wird, bevor sie gespeichert wird. Äquivalente Anmerkungen existieren für @PostPersist
, @PreLoad
und @PostLoad
.
@Entity(value="users", noClassNameStored = true)
public class User {
// Properties
private Date createdDate;
...
// Getters and setters
..
@PrePersist
public void prePersist() {
this.createdDate = (createdDate == null) ? new Date() : createdDate;
}
}