如何在JPA实体的集合字段中获得特定的元素?



我使用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));

最新更新