我有这个实体结构:
@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;
}
我从外部库中获得了两个规范。这些规范中的每一个都有针对儿童领域的谓词。逻辑与此类似:
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 = ?