Я пытаюсь создать фильтр для реализаций 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;
}