От документация , Morphia не съхранява стойности Null/Empty (по подразбиране), така че заявката
query.and(
query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null)
);
няма да работи, тъй като изглежда, че не можете да правите заявки за null, но можете да правите заявки за конкретна стойност.
Въпреки това, тъй като можете да правите заявки само за конкретна стойност, можете да измислите заобиколно решение, при което можете да актуализирате createdDate
поле със стойност на дата, която никога не се използва във вашия модел. Например, ако инициализирате обект Date с 0, той ще бъде зададен в началото на епохата, 1 януари 1970 г. 00:00:00 UTC. Часовете, които получавате, са локализираното отместване на времето. Ще бъде достатъчно, ако вашата актуализация включва само модифициране на съвпадащия елемент(и) в mongo shell, следователно ще изглежда подобно на това:
db.users.update(
{"createdDate": null },
{ "$set": {"createdDate": new Date(0)} }
)
След това можете да използвате Fluent Interface за заявка за тази конкретна стойност:
Query<User> query = mongoDataStore
.find(User.class)
.field("createdDate").exists()
.field("createdDate").hasThisOne(new Date(0));
Би било много по-лесно, когато дефинирате вашия модел, да включите метод prePersist, който актуализира полето createdDate. Методът е маркиран с @PrePersist
анотация, така че датата да бъде зададена в поръчката, преди да бъде запазена. Съществуват еквивалентни анотации за @PostPersist
, @PreLoad
и @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;
}
}