[英]how to transform JPA specification from child entity to parent entity
我有一个相当大的系统,其规范是由子实体上的几种方法构建的。 所以我有一个用户在宠物上使用 OneToMany,就像在这个问题中一样。 我的关系是双向的,所以 Pet 在 User 上也有一个 ManyToOne 关系,我正在努力将子实体的规范转换为应用于父实体。
我查找的大多数问题都显示了如何将规范应用于不同的实体,或者在执行规范后获取不同的实体。 这不是我要找的。
我正在尝试编写这样的方法:
public static Specification<User> extendsPetSpecToUser(
Specification<Pet> petSpec) {
// ???
}
但我不知道如何编写它(我尝试使用 Join,但没有设法向 JPA“说”以将连接和规范结合起来以不同的根但类似的约束进行查询)
鉴于规范很大并且在其他部分也用于直接查询 Pet,从不同的根重写它并不是一个真正的选择。
感谢您抽出宝贵时间,很抱歉,如果这是重复的,我真的没有看到另一个符合我需要的问题。
首先,感觉这个问题隐藏了您使用的查询的奇怪结构。
如果最后需要Specification<User>
,为什么要构建Specification<Pet>
?
可能需要考虑一个代码架构。
无论如何,为了实现上述目标,您是否尝试过使用子查询?
public class TransformToUser implements Specification<User> {
private final Specification<Pet> specification;
public TransformToUser (Specification<Pet> specification) {
this.specification = specification;
}
@Override
public Predicate toPredicate(
Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Subquery<Pet> subqueryPet = criteriaQuery.subquery(Pet.class);
Root<Pet> fromPet = subqueryDeclaration.from(Pet.class);
subqueryPet.select(fromPet);
subqueryPet.where(
specification.toPredicate(fromPet, criteriaQuery, criteriaBuilder));
return root.get(User_.pets).in(subqueryPet);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.