我使用Criteria API从数据库检索实体。我有两个实体如下:
public class EntityA {
String primaryKey;
@JoinColumn(
updatable = false,
insertable = false,
name = "primaryKey",
referencedColumnName = "primaryKeyOne")
List<EntityB> list;
}
public class EntityB {
String primaryKeyOne;
String primaryKeyTwo;
String name;
Integer value;
}
现在我想使用这两个实体创建一个Spring JPASpecification
。
public interface Specification<T> {
Predicate toPredicate(Root<T> root, CriteriaQuery<?> cr, CriteriaBuilder cb);
}
取EntityA
后,我可以得到EntityB
的整个列表。但是,如何过滤出EntityB
的特定实例并使用它创建predicate
呢?我的意图如下:
cb.gt(root.get("list").stream().filter(e -> "abc".equals(e.getName())).get("value"), 100)
通常应该在两个实体之间执行连接,并基于join
进行过滤。
在您的示例中,规范将类似于以下内容:
public class EntityASpecifications {
public static Specification<EntityA> toSpecification(String name, Integer value){
return (root, criteriaQuery, criteriaBuilder) -> {
Join<EntityA, EntityB> entityBJoin = root.join("list");
return criteriaBuilder.and(
criteriaBuilder.equal(entityBJoin.get("name"), name),
criteriaBuilder.gt(entityBJoin.get("value"), value)
);
};
}
}
然后您将与EntityA的存储库一起使用,如下所示
entityARepository.findAll(EntityASpecifications.toSpecification("abc", 100));