【问题标题】:Join and inheritance jpa加入和继承jpa
【发布时间】:2018-07-17 19:54:00
【问题描述】:

我使用spring数据,jpa和hibernate实现

我正在编写高级搜索

public class Samples  extends BaseEntity{
    ..
    @Id
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "sampling_id", referencedColumnName = "id"),
        @JoinColumn(name = "sampling_year", referencedColumnName = "year")})
    private Samplings sampling;
    ...
}

@Entity
@IdClass(SamplingsPK.class)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Samplings extends  extends BaseEntity{
    @OneToOne
    private Products product;
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Products  extends BaseEntity{
    ...
    @ManyToOne(fetch = FetchType.LAZY)
    private ProductTypes productType;
}

@Entity
@DiscriminatorValue("TraditionalProducts")
public class TraditionalProducts extends Products {
    ...
}

@Entity
@DiscriminatorValue("GranulateProducts")
public class GranulateProducts extends Products  {
     @ManyToMany(mappedBy="granulateProducts")
    private Set<Suppliers> suppliers = new HashSet<>();
}

@Entity
@DiscriminatorValue("GranulateSamplings")
public class GranulateSamplings extends Samplings{
    OneToOne(optional = true, fetch = FetchType.EAGER)
    @JoinColumn
    private Suppliers supplier;
    ...
}

还有这种搜索方式

 public Page<Samples> advancedSearch(SamplesSearchDto search, Pageable page) {
     Specification<Samples> specification = (Root<Samples> root, CriteriaQuery<?> cq, CriteriaBuilder cb) -> {

         Predicate p = cb.conjunction();

         if (search.getProductsId() != null) {
             Join<Samples, Samplings> samplings = (Join) root.join("sampling");
             Join<Samples, Products> product = (Join) samplings.join("product");
             p.getExpressions().add(cb.equal(product.get("id"), search.getProductsId()));
         }

        if (search.getSuppliersId() != null) {
            Join<Samples, Samplings> samplings = (Join) root.join("sampling");
            Join<Samplings, Suppliers> supp = samplings.join("supplier");
            p.getExpressions().add(cb.equal(supp.get("id"), search.getSuppliersId()));
            //supplier name field is used in GranulateSamplings

        }

        return p;

    };

    return this.findAll(specification, page);
}

对于我的供应商字段搜索,我想如何加入扩展产品的 GranulateSamplings? 因为该字段仅在 GranulateSamplings 实体中可用

编辑

我收到此错误

无法在此找到名称为 [供应商] 的属性 Managedtype com.lcm.mode.Samplings

这就像是无法单独做样品和供应商之间的桥梁

编辑

Join<Samples, Samplings> samplings = (Join) root.join("sampling");
Join<GranulateSamplings, Suppliers> supp = samplings.join("supplier");
p.getExpressions().add(cb.equal(supp.get("id"), search.getSuppliersId()));

同样的问题

【问题讨论】:

    标签: hibernate jpa spring-data-jpa jpa-criteria


    【解决方案1】:
    Join<Products, suppliers> supp = product.join("suppliers");
    p.getExpressions().add(cb.equal(supp.get("id"), search.getSuppliersId()));
    

    SuppliersId 表示您有多个,只需迭代并添加您需要的所有等号

    PD:类,尤其是实体,不应以复数形式命名

    【讨论】:

    • 供应商不是直接在产品中而是在 GranulateProducts... jpa 能找到吗?很容易找到对复数说相反的人......无论如何,与最初的帖子无关
    • 对,如果你要过滤一些suppliersId,连接应该是Granulate而不是通用类型ProductJoin&lt;GranulateProduct, ...&gt;
    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 2022-10-25
    • 2011-08-20
    • 2015-08-31
    • 2010-10-27
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多