JPA 规范和 .where 子句中的空参数



我写了两个规范,如果它们的参数为空,则返回 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,它只是被忽略(就像它应该的那样(,并且查询只匹配另一个谓词。
  • 如果我切换两个谓词,将ByIng作为第一个谓词,然后将ByLinea放在where子句中,则所有组合都可以正常工作。

避免从方法返回null是一种很好的做法。

您可以使用criteriaBuilder.conjunction(( 忽略null参数Specification。它总是生成truePredicate.有一个相反的方法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 + "%"
);            
}
}

附言如果第一个Specificationnull尝试访问方法and,您会NullPointerException。 需要明确的是,它看起来像这样

Specification.where(null.and(getProdottoByIngSpec(ing)));

但是,如果只有第二Specificationnull这个有效

Specification.where(getProdottoByLineaSpec(linea).and(null));

因为可以null方法参数

相关内容

  • 没有找到相关文章

最新更新