我写了两个规范,如果它们的参数为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;
}
然后,我创建了第三个,它将先前的内容与and
子句中的where
运算符组合在一起:
public static Specification<Prodotto> getProdottoByMainTraits (String linea, String ing) {
return Specification.where(getProdottoByLineaSpec(linea).and(getProdottoByIngSpec(ing)));
}
现在,这是有趣的部分:
ByLinea
返回null
,则在解析nullPointerException
子句时,我从checkPackageAccess
得到了where
。ByIng
返回null
,它将被忽略(就像应该这样),并且查询仅与另一个谓词匹配。ByIng
放在第一个,然后将ByLinea
放在where
子句中,则所有组合都可以工作。答案 0 :(得分:3)
避免从方法中返回List<List<int>> result = new List<List<int>>();
是一个好习惯。
您可以使用null
。conjunction()忽略criteriaBuilder
参数null
。它总是产生Specification
true
。有相反的方法Predicate
。disjunction()
criteriaBuilder
P.S。如果第一个public static Specification<Prodotto> getProdottoByLineaSpec (String linea) {
return (root, query, criteriaBuilder) -> {
if (linea == null) {
return criteriaBuilder.conjunction();
}
return criteriaBuilder.like((root.join("linea")).get("nome"), "%" + linea + "%");
}
}
是NullPointerException
尝试访问方法Specification
,则会得到null
。
要清楚,它看起来像这样
and
但是如果只有第二个Specification.where(null.and(getProdottoByIngSpec(ing)));
是Specification
,那么这个有效
null
因为and方法参数可以是Specification.where(getProdottoByLineaSpec(linea).and(null));