hibernate - 加入和继承jpa
问题描述
我使用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 上找到名称为 [suppliers] 的属性
就像是无法单独做样品和供应商之间的桥梁
编辑
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()));
同样的问题
解决方案
Join<Products, suppliers> supp = product.join("suppliers");
p.getExpressions().add(cb.equal(supp.get("id"), search.getSuppliersId()));
SuppliersId
表示您有多个,只需迭代并添加您需要的所有等号
PD:类,尤其是实体,不应以复数形式命名
推荐阅读
- c++ - 无法在 QWebEngineView 中登录 Google:此应用可能不安全
- javascript - 如何等待事件完成并访问 NodeJS 范围之外的回调变量
- emacs - Emacs 的搜索/提升孔 Idris 命令
- sql - 运行更新语句的意外结果
- c# - 如何在 json 结果中格式化自定义类型?
- c# - 如何在实体框架中的多个数据库之间共享类?
- python - IllegalArgumentException - H2O 在 Python 中导入 MOJO 文件失败
- php - 为什么 PHP PSR-11 Container 不提供设置依赖的方法?
- javascript - 将带参数的函数添加到变量
- java - 单击时的 JavaFx TabPane 样式