Play 2.0 Framework-найти все, что еще не истекло
Я пытаюсь понять, как я могу найти членов списка - но только тех, у которых еще не истек срок их действия - что является одним из свойств модели.
Прямо сейчас у меня есть:
public static Result getAllNotifications() {
List<Notification> notifications = Notification.getAllNotifications();
for (Notification i: notifications) {
List<Attachments> attachments = Attachments.findAllById(i.id);
i.attached = attachments;
}
return ok(toJson(notifications));
}
Где-то там мне нужно проверить дату истечения срока действия отдельного уведомления и не возвращать его, если сегодня эта дата уже прошла.
Сейчас эта модель на уведомление выглядит следующим образом:
public class Notification extends Model {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@NonEmpty
public Long id;
@Constraints.Required
public String title;
@Formats.DateTime(pattern = "dd/MM/yyyy")
public Date created = new Date();
@Constraints.Required
@Column(columnDefinition="TEXT")
public String text;
@Formats.DateTime(pattern = "dd/MM/yyyy")
public Date updated = new Date();
public Boolean status;
public Date expires;
public String author;
public List<Attachments> attached;
public Notification() {
}
public Notification(Long id, String title, String text) {
this.created = new Date();
this.title = title;
this.text = text;
this.id = id;
}
public static Model.Finder<String, Notification> find = new Model.Finder<String, Notification>(String.class, Notification.class);
Это мой первый пост Stackoverflow, так что полегче. на меня! И заранее благодарю вас за помощь!
2 ответа:
Хм, вы ищете все строки, дата которых
expires
больше текущейOR
этоnull
(Не задано), верно?В таком случае вы можете просто использовать простое сравнение БД (итерация всего результирующего набора определенно неправильная идея!)
gt
означаетGreater Than
lt
дляLower Than
В вашей модели добавьте искатели:
// If expires date is grater than current one, the Notification IS expired public static List<Notification> findAllExpired() { return find.where().gt("expires", new Date()).findList(); } // If expires date is lower than current one OR isn't set at all, // the Notification is valid. public static List<Notification> findAllNotExpired() { return find.where().or( Expr.lt("expires", new Date()), Expr.isNull("expires") ).findList(); }
Таким образом, вы получите список не истекших (или не истекших) уведомлений в вашем контроллере:
List<Notification> notExpiredList = Notification.findAllNotExpired(); // check in terminal for (Notification notification : notExpiredList) { Logger.info("This Notification IS NOT expired: " + notification.title); } List<Notification> expiredList = Notification.findAllExpired(); // check in terminal for (Notification notification : expiredList) { Logger.warn("This Notification IS expired: " + notification.title); }
Можно использовать итератор и удалить все уведомления, срок действия которых истек.
Что-то вроде этого:
public static Result getAllNotifications() { List<Notification> notifications = Notification.getAllNotifications(); Iterator<Notification> iterator = notifications.iterator(); while (iterator.hasNext()) { Notification next = iterator.next(); if (new Date().after(next.expires)) { iterator.remove(); } } for (Notification i: notifications) { List<Attachments> attachments = Attachments.findAllById(i.id); i.attached = attachments; } return ok(toJson(notifications)); }
Если список неизменяем, вы можете вернуть его отфильтрованную копию.