Фильтр по связям ManyToOne с Hibernate - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь создать фильтр для реализаций ManyToOne с помощью hibernate. Но я не могу понять это.
Я могу отфильтровать отношения OneToMany с аннотацией @Filter. Но я не знаю, как фильтровать в другом направлении.

Класс TestRun будет записью для моего запроса, и я хочу получить последний запуск с конкретными customer и branch. Хотя я не знаю, как получить только последний запуск, который выходит за рамки этого вопроса.

В дополнение к фильтрации customer и branch я хочу иметь возможность получать только те результаты, с которыми связан определенный componentName. Проблема в том, что componentName содержится не в самом результате, а в связанном testCase.

Короче говоря:

Я хочу получить TestRun для клиента и филиала с TestResults, которые соответствуют условию для связанной сущности TestCase.

Что я пробовал:

Я пытался добавить аннотацию @Filter в столбец componentName TestCase, но это не работает. Я также попытался написать собственный запрос для своего класса репозитория. Но я возился с объединениями, которые, кажется, не влияют на результат. Вместо того, чтобы получить отфильтрованный список TestResults для моих TestRun объектов, я получил длинный список TestRuns из-за объединения.

Понятия не имею, как с этим справиться. Я думал о создании двух запросов вместо одного. Но, по-моему, это было бы не так чисто. Я полагаю, что это не очень особый случай, что означает, что для такого рода запросов может быть простое решение.

Мои сущности

TestRun

@Entity
@Table(name = "test_run")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "testrun")
@FilterDef(
    name = "byCustomerAndBranch",
    parameters = {
        @ParamDef(
            name = "customer",
            type = "string"
        ),
        @ParamDef(
            name = "branch",
            type = "string"
        )
    }
)
@Filter(
    name = "byCustomerAndBranch",
    condition = "customer = :customer and branch = :branch"
)
public class TestRun implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "customer", nullable = false)
    private String customer;

    @NotNull
    @Column(name = "branch", nullable = false)
    private String branch;

    @OneToMany(mappedBy = "testRun")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<TestResult> testResults = new HashSet<>();
}

TestResult

@Entity
@Table(name = "test_result")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class TestResult implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @ManyToOne(optional = false)
    @NotNull
    @JsonIgnoreProperties("testResults")
    private TestRun testRun;

    @ManyToOne(optional = false)
    @NotNull
    @JsonIgnoreProperties("testResults")
    private TestCase testCase;
}

TestCase

@Entity
@Table(name = "test_case")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class TestCase implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "component_name", nullable = false)
    private String techComponent;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...