Z dokumentace , Morphia neukládá hodnoty Null/Empty (ve výchozím nastavení), takže dotaz
query.and(
query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null)
);
nebude fungovat, protože se zdá, že nejste schopni dotazovat se na null, ale můžete dotazovat na konkrétní hodnotu.
Protože se však můžete dotazovat pouze na konkrétní hodnotu, můžete navrhnout řešení, kde můžete aktualizovat createdDate
pole s hodnotou data, která se ve vašem modelu nikdy nepoužívá. Pokud například inicializujete objekt Date s 0, bude nastaven na začátek epochy, 1. ledna 1970 00:00:00 UTC. Hodiny, které získáte, jsou lokalizovaný časový posun. Bude postačující, pokud vaše aktualizace bude zahrnovat pouze úpravu odpovídajících prvků v mongo shell, takže bude vypadat podobně jako toto:
db.users.update(
{"createdDate": null },
{ "$set": {"createdDate": new Date(0)} }
)
Poté můžete použít Fluent rozhraní pro dotaz na tuto konkrétní hodnotu:
Query<User> query = mongoDataStore
.find(User.class)
.field("createdDate").exists()
.field("createdDate").hasThisOne(new Date(0));
Při definování modelu by bylo mnohem jednodušší zahrnout metodu prePersist, která aktualizuje pole createdDate. Metoda je označena @PrePersist
anotace tak, aby bylo datum nastaveno na objednávce před jejím uložením. Pro @PostPersist
existují ekvivalentní anotace , @PreLoad
a @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;
}
}