繁体   English   中英

如何从多对多获取数据或查询?

[英]how to get data or query from Many to Many?

我有产品和代码实体,并为他们建立了ManyToMany关系,所以它将成为Product_Code

因此Product_Code将具有product_id和product_id

我真的很想通过代码从产品中获取数据,但是我想要的结果我也想从产品值和代码值中获取详细信息,我不知道如何在JPA上做到这一点

我在想先获取产品代码,然后在Product_Code表上找到该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实体,而不是Product实体, Base实体是可重用的实体,如generate id, token, createdAt, deletedAt, updatedAt

这可以通过启用JpaSpecificationExecutor<Product>存储库上的Specification<Product>来实现。

  1. 确保您的ProductRepository实现JpaSpecifiactionExecutor<Product>

然后,在您的@Service注入VoucherRepositoryProductRepository某个位置执行以下操作:

//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元模型可能看起来像(现在),但是,我建议使用元模型生成器。

@StaticMetamodel(Product.class)
public class Product_ {
      public static volatile SetAttribute<Product, Code> codes;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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