我有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))
它给了我想要的东西,但是我不知道如何将其移到标准代码中。
有什么建议吗?