按实体2和实体2的多对多关系过滤实体1,

时间:2019-12-24 13:59:43

标签: java spring-data-jpa criteria-api

我有3个实体:

@Entity
public class EntityB {

    @Id
    @Column(nullable = false)
    private String stringId;
}


@Entity
public class EntityA {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @OneToMany(mappedBy = "entityAEntityBId.entityA", cascade = {
            CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH
    })
    private List<EntityAEntityB> entitiesB;
}


@Entity
@AssociationOverrides({
        @AssociationOverride(name = "entityAentityBId.entityA",
                joinColumns = @JoinColumn(name = "entity_a_id")),
        @AssociationOverride(name = "entityAentityBId.entityB",
                joinColumns = @JoinColumn(name = "entity_b_id"))
})
public class EntityAEntityB {

    @EmbeddedId
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private EntityAEntityBKey entityAentityBId;

    private int extraField;
}


@Embeddable
public class EntityAEntityBKey implements Serializable {

    @ManyToOne(cascade = {
            CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH
    })
    private EntityA entityA;

    @ManyToOne(cascade = {
            CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH
    })
    private EntityB entityB;
}

我正在尝试编写Specification,它可以为我提供EntityA的所有实例,这些实例在其EntityB下具有所有几个特定的​​List<EntityAEntityB>

public static Specification<EntityA> withEntitiesB(List<EntityB> entitiesB) {
        return (root, query, builder) -> {
                Predicate predicate = builder.conjunction();
                Expression<List<EntityAEntityB>> entityAEntityB = root.get("entitiesB");
                for(EntityB entityB : entitiesB)
                    predicate = builder.and(predicate, builder.isMember(entityB, entityAentityB));

                return predicate;

            }
        };
    }

由于我的Expression类型错误,因此当然无法使用。我的问题是...是否可以将Expression<List<EntityAEntityB>> entityAEntityB转换为Expression<List<EntityB>> entityAEntityB?或者...也许还有其他方法可以实现我想要实现的目标?

在原始SQL中,我做了类似的事情...

SELECT a.id FROM entity_a a JOIN entity_a_entity_b ab ON
a.id = ab.entity_a_id WHERE ab.entity_b_id IN (values from list passed in specification method (entitiesB))
GROUP BY a.id HAVING COUNT(a.id) = (size of the list passed in specification method (entitiesB))

它给了我想要的东西,但是我不知道如何将其移到标准代码中。

有什么建议吗?

0 个答案:

没有答案