我需要在不同的实体和多列上写一些标准。目前,我有多个规范类,一个针对ekach实体。如何使所有实体通用的单个jpa规范。
如果您要在不同实体上应用多重规范以获得结果,则将无法混合使用不同的规范类型,因为规范与您要从查询中检索的实体相关。但是,可以通过使用联接链接要检索的实体的规范来实现这种结果。
假设您有一个实体产品,其中包含具有“名称”属性的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")));
此特定示例将检索所有包含名为“颜色”的字段,其中包含“蓝色”或“橙色”值的所有产品的列表。
希望这会有所帮助