У меня есть одна родительская сущность, у которой есть две дочерние сущности в качестве атрибутов. Я хочу выбрать все элементы из родительской сущности, которые имеют ЛИБО childOne с заданным параметром в качестве личного атрибута ИЛИ childTwo с тем же заданным параметром в качестве личного атрибута.
Вот упрощенные три моих класса:
Родительский объект:
@Entity
public class ParentObject {
@Id
private int id;
private int fkChildOne;
private int fkChildTwo;
@ManyToOne
@JoinColumn(name = "fk_child_one_id", referencedColumnName =
"child_one_id")
private ChildOne childOne;
@ManyToOne
@JoinColumn(name = "fk_child_one_id", referencedColumnName =
"child_one_id")
private ChildTwo childTwo;
// getters and setters
}
Дочерний объект:
@Entity
public class ChildOne {
@Id
private int childOneId;
private String nameChildOne;
@OneToMany
@JoinColumn(name = "fk_child_one_id")
private List<ParentObject> parents;
// getters and setters
}
Дочерний объект-два:
@Entity
public class ChildTwo {
@Id
private int childOneId;
private String nameChildTwo;
@OneToMany
@JoinColumn(name = "fk_child_two_id")
private List<ParentObject> parents;
// getters and setters
}
Класс спецификаций:
public static Specification<ParentObject> checkName(String name) {
return Specifications.where(
(root, query, builder) -> {
final Join<ParentObject, ChildOne> joinchildOne =
root.join("childOne");
final Join<ParentObject, ChildTwo > joinchildTwo =
root.join("childTwo");
return builder.or(
builder.equal(joinchildOne .get("nameChildOne"), name),
builder.equal(joinchildTwo .get("nameChildTwo"), name)
);
}
);
}
Когда этот сп c вызывается в моем сервисе, я не получаю результатов. Однако, если я закомментирую одно из двух объединений и соответствующий предикат в моем методе builder.or, то я получаю некоторые результаты, но они явно не соответствуют тому, что я ищу, а именно: выбрать каждый ParentObject, у которого есть либо ChildOne с этим параметром или ChildTwo с этим параметром.
Есть подсказка, что не так с кодом?