У меня есть один родительский объект, который имеет два дочерних объекта в качестве атрибутов. Я хочу выбрать все элементы из родительского объекта, у которых есть ЛИБО 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
}
Дочерний объект Two:
@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)
);
}
);
}
Когда эта спецификация вызывается в моей службе, я не получаю никаких результатов. Однако, если я закомментирую одно из двух соединений и соответствующий предикат в моем методе builder.or, то я получу некоторые результаты, но они, очевидно, не соответствуют тому, что я ищу, то есть выбрать каждый ParentObject, у которого есть либо ChildOne с этим параметром или ChildTwo с этим параметром.
Любая подсказка, что не так с кодом?