Вот мой родительский класс.
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.