Можно ли объединить две спецификации для сущностей OneToMany? - PullRequest
0 голосов
/ 29 мая 2020

У меня есть такая структура сущности:

@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 = ?
...