У меня есть такая структура сущности:
@Entity
public class Parent {
@Id
private UUID id;
@OneToMany
private Set<Child> children;
}
@Entity public class Child {
@Id
private UUID id;
private String name;
private int age;
}
И я получил две спецификации из внешней библиотеки. Каждая из этих спецификаций имеет предикат для дочерних полей. Лог c аналогичен этому:
Specification<Parent> childNameSpecification = (root, query, builder) -> {
Path<Object> childName = root.join("children").get("name");
return builder.equal(childName, name);
};
Specification<Parent> childAgeSpecification = (root, query, builder) -> {
Path<Object> childAge = root.join("children").get("age");
return builder.equal(childAge, age);
};
Если я объединю эти две спецификации с помощью and
, я получу два разных соединения в результирующем запросе. Вот как я присоединяюсь к этим спецификациям:
Specification<Parent> parentSpecification = Specification.where(childNameSpecification).and(childAgeSpecification);
И в результате я получаю этот запрос:
select parent0_.id as id1_1_
from parent parent0_
inner join child children1_
on parent0_.id = children1_.parent_id
inner join child children2_
on parent0_.id = children2_.parent_id
where children2_.name = ?
and children1_.age = ?
Можно ли объединить эти спецификации, чтобы получить одно соединение в результирующем запросе ? Это ожидаемый запрос:
select parent0_.id as id1_1_
from parent parent0_
inner join child children1_
on parent0_.id = children1_.parent_id
where children1_.name = ?
and children1_.age = ?