gpt4 book ai didi

spring-boot - 如何使用 Spring Data JPA(Hibernate) 跨映射表过滤关联实体?

转载 作者:行者123 更新时间:2023-12-04 12:01:57 27 4
gpt4 key购买 nike

有没有办法使用 @OneToMany 过滤软删除的多对多关联?和 @ManyToOne ,跨一个中间实体(映射表)?productproduct_option_group处于 N:M 关系。我正在使用 disabled_datetime 实现软删除列并希望过滤 ProductOptionGroup 的集合来自 Product实体。 This post正在使用 @ManyToMany@Where为达到这个。我跟着它工作(禁用 product_option_group s 被过滤)。备注 @WhereProductOptionGroup类(class)。

// `product` <-> `product-product_option_group` <-> `product_option_group`

@Entity
@Table(name = "product")
public class Product implements Serializable {
...

@ManyToMany
@JoinTable(name = "product-product_option_group",
joinColumns = @JoinColumn(name = "product_id"),
inverseJoinColumns = @JoinColumn(name = "product_option_group_id"))
private final Set<ProductOptionGroup> productOptionGroups = new HashSet<>();

...
}

@Entity
@Table(name = "product_option_group")
@Where(clause = "disabled_datetime is null")
public class ProductOptionGroup implements Serializable {
...

@Column(name = "disabled_datetime")
private ZonedDateTime disabledDatetime;

...
}
但我想用 @OneToMany走向 product-product_option_group表,像这样。
@Entity
@Table(name = "product")
public class Product implements Serializable {
...

@OneToMany(mappedBy = "id.product")
private final Set<ProductProductOptionGroup> productProductOptionGroups = new HashSet<>();

...
}

@Entity
@Table(name = "`product-product_option_group`")
public class ProductProductOptionGroup implements Serializable {
@EmbeddedId
private final ProductProductOptionGroupId id = new ProductProductOptionGroupId();

...
}

@Embeddable
public class ProductProductOptionGroupId implements Serializable {
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "product_id", referencedColumnName = "id")
private Product product;

@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "product_option_group_id", referencedColumnName = "id")
@Where(clause = "disabled_datetime is null")
private ProductOptionGroup productOptionGroup;
}

@Entity
@Table(name = "product_option_group")
@Where(clause = "disabled_datetime is null")
public class ProductOptionGroup implements Serializable {
...
}
但随后 @Where注释将不再起作用,因此禁用 product_option_group s 也被选中。如何解决这个问题?

最佳答案

我想在等待答案时添加解决方法。
首先,我可以添加一个 View 作为过滤器。

CREATE VIEW `product-product_option_group-enabled` AS
SELECT *
FROM `product-product_option_group` ppog
JOIN product_option_group pog ON ppog.product_option_group_id = pog.id
AND pog.disabled_datetime IS NULL;
@Entity
@Table(name = "`product-product_option_group-enabled`") // using the view as a filter
public class ProductProductOptionGroupEnabled implements Serializable {
@EmbeddedId
private final ProductProductOptionGroupId id = new ProductProductOptionGroupId();

...
}
然后使用 ProductProductOptionGroupEnabled用于阅读和 ProductProductOptionGroup对于任何数据修改都可能解决问题。我不喜欢这个。
  • 一个实体的多个集合。修改时必须小心。
  • 同一张 table 上的 2 个不同的实体。编排这些可能很困难( equals()hashCode() )。
  • 添加 View 。更改架构时最好小心。

  • 也许我可以利用 Updatable and Insertable Views ,但我仍然需要 ProductProductOptionGroup用于选择每一行。

    其次,我可以从 Java 过滤集合。
    @Entity
    @Table(name = "product")
    public class Product implements Serializable {
    ...

    @OneToMany(mappedBy = "id.product")
    private final Set<ProductProductOptionGroup> productProductOptionGroups = new HashSet<>();

    public Set<ProductProductOptionGroup> getProductProductOptionGroups() {
    return productProductOptionGroups.stream()
    .filter(o -> o.getId().getProductOptionGroup().getDisabledDatetime() == null)
    .collect(Collectors.toSet());
    }

    public Set<ProductProductOptionGroup> getProductProductOptionGroupsAll() {
    return productProductOptionGroups;
    }

    ...
    }
    然后使用 getProductProductOptionGroups()获取过滤后的集合。我也不喜欢这个。
  • 它将从 product-product_option_group 中选择每一行表不分disabled_datetime .
  • 创建另一个集合。修改时必须小心。
  • javax.persistence.EntityNotFoundException: Unable to find with id xxx可能发生。可以通过join fetch解决寻找麻烦的实体
  • 关于spring-boot - 如何使用 Spring Data JPA(Hibernate) 跨映射表过滤关联实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68030617/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com