5

モデルのプロパティの1つである、リストのメンバー(ただし、有効期限を過ぎていないメンバーのみ)を見つける方法を見つけようとしています。

今私は持っています:

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投稿なので、気楽にやってください!そして、事前に助けてくれてありがとう!

4

2 に答える 2

5

うーん、あなたは日付が現在の行(設定されていない)expiresよりも大きいすべての行を探していますよね?ORnull

このような場合は、単純なDB比較を使用できます(結果セット全体を繰り返すことは間違いなく間違った考えです!

  • 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);
}
于 2012-11-14T19:44:14.957 に答える
1

イテレータを使用して、期限切れのすべての通知を削除できます。

このようなもの:

    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));
  }

リストが不変である場合は、そのリストのフィルター処理されたコピーを返すことができます。

于 2012-11-14T14:13:58.363 に答える