繁体   English   中英

如何将 JPA 规范从子实体转换为父实体

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM