我写了两个规范,如果它们的参数为空,则返回空。
public static Specification<Prodotto> getProdottoByLineaSpec (String linea) {
if (linea != null) {
return (root, query, criteriaBuilder) -> {
return criteriaBuilder.like((root.join("linea")).get("nome"), "%"+linea+"%");
};
}
else return null;
}
public static Specification<Prodotto> getProdottoByIngSpec (String ing) {
if (ing != null) {
return (root, query, criteriaBuilder) -> {
return criteriaBuilder.like(((root.join("listaQuoteIng")).join("ing")).get("nome"), "%"+ing+"%");
};
}
else return null;
}
然后我创建了第三个,它将前面的与子句中的and
运算符结合起来:where
public static Specification<Prodotto> getProdottoByMainTraits (String linea, String ing) {
return Specification.where(getProdottoByLineaSpec(linea).and(getProdottoByIngSpec(ing)));
}
现在,这是有趣的部分:
- 如果
ByLinea
返回null
,我会在解决子句时得到一个nullPointerException
from 。checkPackageAccess
where
- 如果
ByIng
返回null
,它只是被忽略(就像它应该的那样)并且查询只匹配另一个谓词。 - 如果我切换两个谓词,将
ByIng
第一个谓词放在子句中,那么ByLinea
在where
每种组合中一切都有效。