Фильтр спецификации JPA на основе дочерней сущности - PullRequest
0 голосов
/ 05 марта 2020

Вот мой родительский класс.

    class Grouping{

          @Id
          private Long id; // primary key
          private Long groupingId; // grouping id
          private String name;
          private Date effectiveTillDate;

          @OneToMany(cascade = CascadeType.ALL,orphanRemoval = true)
          private List<Status> statusList;

    }

Вот дочерний класс

    class Status{

        @Id
        private Long id; // student id
        private String statusCode; //value  = pending_approval, live, pending_closure, closed
        private Date effectiveTillDate;
        private Long grpId; //points to primary key of parent table
        private Long grpGid; // points to groupingId column of parent table
    }

Вот моя спецификация, которую я написал.

public static Specification<Grouping> hasStatus(String status) {
    if (status == null) {
        return null;
    }
    String s = status.trim();
    if (s.isEmpty()) {
        return null;
    }
    return (root, query, cb) -> {
        return cb.equal(root.join("statusList").get("statusCode"), s);
    }
}

Здесь соединение основано на полях классов, что аналогично обычному соединению, которое мы делаем. Эта спецификация возвращает мне список группировок со статусом, переданным в качестве аргумента.

Теперь в базе данных может быть одна временная копия объекта группировки с тем же groupingId. Допустим, есть группировка с «живым» статусом-кодом

grouping : id=1, groupingId = 11, name=test, effectiveTillDate=31/12/2025,
       status[{id=1, statusCode=live, effectiveTillDate=31/12/2025, grpId = 1, grpGid = 11}]

Теперь я хочу закрыть эту группировку, поэтому я сделаю временную копию этой группировки и переместу ее в статус «pending_closure», который позже может быть утвержденным администратором и go в статус «закрыт», если статус «отклонен» останется «живым». Таким образом, наш новый объект группировки будет выглядеть следующим образом:

grouping : id=2, groupingId = 11, name=test, effectiveTillDate=31/12/2025,
               status[{id=2, statusCode=pending_closure, effectiveTillDate=31/12/2025, grpId = 1, grpGid = 11}]

Обе группы выше относятся к одному и тому же groupingId, где первый - текущее состояние, а последний - временная копия этой же группировки. примечание: мы можем создать только временную копию, если текущая группировка имеет статус «живая».

Итак,

1) I want to find all the groupings who have an associated transient copy.
 - I thought of checking if there are two copies for given groupingId, then one with who does not have status "live" of them must be transient, but I don't know how to do this.



2) I want to find all groupings except transient.
  - I thought of checking if there are two copies for given groupingId, then one with status "live"must be transient, and if only one copy is there then should be included in the result list.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...