JPA Двунаправленные родительско-дочерние отношения и репозитории - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть таблица с именем 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? Или я должен написать свой собственный запрос?

Я не могу запросить только те результаты, у которых есть родитель, потому что мы можем перезапустить повтор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...