我有产品和代码实体,我为它们建立了许多托马尼的关系,所以它将是product_code
因此,product_code将具有product_id和product_id
我真的想通过代码从产品中获取数据,但是我想要的结果我想要从产品值和代码值中获取详细信息,我也不知道如何在JPA上执行此操作
我一直在考虑先获取产品代码,然后在该ID上找到ID产品,然后从中获取数据,然后在代码实体上再次找到代码ID,我确定可以为此获取数据,但是我不知道如何获取数据,我确实想获得简单的方法来了解它的工作原理
我在这里很新
我的实体产品像这样
@Entity
@Table(name = "PRODUCT")
@Setter
@Getter
@DynamicUpdate
public class Product extends Base {
@ManyToMany(mappedBy = "products", fetch = FetchType.EAGER)
private Set<Code> codes;
@Column(name = "NAME", nullable = false)
private String Name;
@Column(name = "DESCRIPTION")
private String description;
public int hasCode() {
return Objects.hashCode(getId());
}
}
这是我的代码实体:
@Entity
@Table(name = "CODE")
@DynamicUpdate
@Setter
@Getter
public class Voucher extends Base {
@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinTable(name = "PRODUCT_CODE",
joinColumns = @JoinColumn(name = "CODE_ID"),
inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID"))
private Set<Product> products;
@Column(name = "CODE", unique = true)
private String codeName;
@Column(name = "TYPE", nullable = false)
private String type;
private String descriptions;
public int hasCode() {
return Objects.hashCode(getId());
}
}
我真的很想在尝试通过代码查找时获取所有数据假设我想找到一个具有" A7"之类的代码的产品,因此我想从产品实体中获取,然后我也将使用product_id和code_id(例如该产品(获得详细的代码实体
当我尝试使用Product findByCode(String code)
或Product findOneByCode(String code)
时结果是我不扩展产品实体的Base
实体,Base
实体是可重复使用的实体,例如生成id, token, createdAt, deletedAt, updatedAt
可以使用JpaSpecificationExecutor<Product>
启用存储库上的Specification<Product>
来实现这一点。
- 确保您的
ProductRepository
实现JpaSpecifiactionExecutor<Product>
然后,在@Service
中使用VoucherRepository
和ProductRepository
注射的某个地方:
//implement a method in VoucherRepository findByName which returns Voucher instance.
Voucher code = voucherRepository.findByName("A7");
//then pass the instance to isMember function in ProductRepository
List<Product> products = productRepository.findAll((r, q, b) -> b.isMember(code, Product_.codes));
注释
r, q, b
是用于lambda表达的方法参数,例如Specification<Product>
覆盖方法toPredicate
的实现。如果您的项目使用Java版本7及以下限制了您,则可以使用以下内容实现此对象:
Specification<Product> spec = new Specification<Product>() {
@Override
public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.isMember(code, root.get(Product_.codes));
}
};
参数
r
代表根元素Root<Product>
q
代表标准查询CriteriaQuery<?>
b
代表标准建造者CriteriaBuilder
Product_.*
是Product
实体的静态元模型。它可以使用JPA模型生成器自动生成,也可以使用@Staticmetamodel
注释手动创建。
通过执行findAll(Specification<Product>)
,您要进行过滤,选择结果列表仅包含匹配您条件的产品的位置。
编辑:
您的 Product
metamodel看起来像(现在(,但是我建议使用metamodel发电机。
@StaticMetamodel(Product.class)
public class Product_ {
public static volatile SetAttribute<Product, Code> codes;
}