我写了两个Specifications,如果它们的参数为null,则返回null。
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;
}
然后我创建了第三个,它将前面的语句与where
子句中的and
操作符结合起来:
public static Specification<Prodotto> getProdottoByMainTraits (String linea, String ing) {
return Specification.where(getProdottoByLineaSpec(linea).and(getProdottoByIngSpec(ing)));
}
这才是有趣的地方
- 如果
ByLinea
返回null
,则在解析where
子句时,我将从checkPackageAccess
获得nullPointerException
。 - 如果
ByIng
返回null
,它将被忽略(就像它应该被忽略一样),查询将只匹配另一个 predicate 。 - 如果我交换两个 predicate ,把
ByIng
作为第一个 predicate ,然后把ByLinea
放在where
子句中,那么在每个组合中一切都正常。
1条答案
按热度按时间vltsax251#
避免从方法返回
null
是一个很好的做法。可以使用
criteriaBuilder
.conjunction()忽略null
参数Specification
。它总是生成true
Predicate
。还有一个相反的方法criteriaBuilder
.disjunction()另外,如果第一个
Specification
是null
试图访问and
方法,则会得到NullPointerException
。但是如果第二个
Specification
是null
,这个就可以了因为方法参数可以是
null