如何对多个实体使用单个jpa规范

问题描述 投票:0回答:1

我需要在不同的实体和多列上写一些标准。目前,我有多个规范类,一个针对ekach实体。如何使所有实体通用的单个jpa规范。

spring-data-jpa
1个回答
0
投票

如果您要在不同实体上应用多重规范以获得结果,则将无法混合使用不同的规范类型,因为规范与您要从查询中检索的实体相关。但是,可以通过使用联接链接要检索的实体的规范来实现这种结果。

假设您有一个实体产品,其中包含具有“名称”属性的Field实体,它们本身包含具有“值”属性的FieldValue实体。您要通过具有一个或多个FieldValues的字段名称来检索产品。这是一段代码,可以为您提供所需的结果:

public static Specification<Product> fieldNameIs(String fieldName) {
    return (root, criteriaQuery, criteriaBuilder) -> {
        return fieldName == null ? null : criteriaBuilder.equal(root.join(Product_.fields).get(Field_.name), fieldName);
    };
}

public static Specification<Product> fieldValuesIn(List<String> fieldValues) {
    return ((root, criteriaQuery, criteriaBuilder) -> {
        if (fieldValues == null || fieldValues.isEmpty()) {
            return null;
        }
        Join<Field, FieldValue> valueJoin = root.join(Product_.fields).join(Field_.fieldValues);
        Expression<String> expression = valueJoin.get(FieldValue_.value);
        return expression.in(fieldValues);
    });
}


public Specification<Product> getProductsByFieldValues(String fieldName, List<String> fieldValues) {
    return Specification.where(fieldNameIs(fieldName)).and(fieldValuesIn(fieldValues));
}

List<Product> prods = productRepository.findAll(productSearch.getProductsByFieldValues("colors", Arrays.asList("blue", "orange")));

此特定示例将检索所有包含名为“颜色”的字段,其中包含“蓝色”或“橙色”值的所有产品的列表。

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.