У меня есть таблица с именем test_run. В этой таблице есть идентификатор parent_run_id, который ссылается на родительский запуск теста (у меня есть это, потому что мы повторно запускали неудачные тесты в их собственном запуске). Этот класс работает как нужно и возвращает родительский и дочерний прогон, когда я запрашиваю идентификатор.
Я хочу найти все тестовые прогоны без ребенка. По сути, это означает, что я хочу получить самые последние повторные тесты или оригинал, если нет повторного запуска. Однако запрос, сгенерированный репозиторием JPA, даже близко не соответствует тому, каким он должен быть.
Мой класс (упрощенно):
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestRun implements Serializable {
private static final long serialVersionUID = 0L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long testRunId;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "parent_run_id", referencedColumnName = "testRunId")
@JsonManagedReference
private TestRun parentRun;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "parentRun")
@JsonBackReference
private TestRun childRun;
}
Мой метод репозитория jpa:
List<TestRun> getByChildRunIsNull();
Соответствующие части запроса, который он генерирует:
select * from "qa_result".test_run test_run
where test_run.test_run_id is null
Очевидно, что оператор where никогда ничего не вернет, поскольку test_run_id является обязательным полем. Существует множество testRuns, которые имеют нулевой childRun, когда я запрашиваю их все, поэтому, по крайней мере, он обрабатывает мой объект так, как я хочу, когда он читает его из базы данных.
Могу ли я сделать это через репозиторий JPA? Или я должен написать свой собственный запрос?
Я не могу запросить только те результаты, у которых есть родитель, потому что мы можем перезапустить повтор.