JPA规范:过滤子实体

时间:2015-01-21 12:01:37

标签: java hibernate jpa soft-delete

我成功地为我的应用程序的实体实现了一个软删除(也就是删除标记)。但是,我还有一个问题。 我已经用findAll和count方法编写了一个自定义JPARepository,用于过滤掉已删除的。我这样做是为了规范:

softDeleteSpecification = new Specification<T>() {
        @Override
        public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            return cb.or(cb.isNull(root.get(DELETED_FIELD_NAME)), cb.equal(root.<T>get(DELETED_FIELD_NAME), false));
        }
    };

如果实体具有例如也被软删除的实体的OneToMany子列表,则不会过滤此列表,因为查询不是由其存储库运行。

我的问题:我可以修改上面的规范,以便过滤掉软删除的孩子吗? 另一种方法是使用反射过滤子项(在查询后手动过滤),但这样做不会有效。

2 个答案:

答案 0 :(得分:0)

使用Hibernate,您可以在实体上使用@Where注释

@Entity
@Where(clause = "deleted = 0")
public class MyEntity {
...

尽管如此,请查看@SQLDelete以获取软删除实现的替代方法。

答案 1 :(得分:0)

我已经开始工作了。如果每个产品都有一个子实体类别,即“类别”是“产品”的子实体,则以下代码对我有效

const getStepContent = step => {

    const allSteps = [
        <Profile 
            index={index} 
            form={form} 
            stepperState={stepperState}
            onUpdateStepperState={handleUpdateStepper}
        />,
        <Step1 />,
        <Step2 />,
        <Step3 />
    ];

    return (
        <>
            {allSteps.map(
                (stepCmp, index) => {
                    return <div hidden={index !== step}>{stepCmp}</dv>
                })
            }
        </>
    );
}