我写了两个规范,如果它们的参数为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
返回return null
,它将被忽略(应该这样),并且查询仅与另一个谓词匹配。ByIng
作为第一个谓词,然后ByLinea
放在where
子句中,则所有组合都可以工作。避免null
从方法返回是一个好习惯。
您可以使用criteriaBuilder
。join()忽略null
parameter Specification
。它总是产生true
Predicate
。有相反的方法criteriaBuilder
。disjunction()
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
这一个作品
Specification.where(getProdottoByLineaSpec(linea).and(null));
因为和方法参数可以是null
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句