0

我写了两个规范,如果它们的参数为空,则返回空。

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,我会在解决子句时得到一个nullPointerExceptionfrom 。checkPackageAccesswhere
  • 如果ByIng返回null,它只是被忽略(就像它应该的那样)并且查询只匹配另一个谓词。
  • 如果我切换两个谓词,将ByIng第一个谓词放在子句中,那么ByLineawhere每种组合中一切都有效。
4

1 回答 1

12

避免null从方法返回是一个好习惯。

您可以使用 criteriaBuilder. 连接()忽略null参数Specification。它总是生成true Predicate. 还有一种相反的方法criteriaBuilder析取()

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 + "%");            
    }
}

PSNullPointerException如果首先尝试访问方法,Specification您会得到。要清楚它看起来像这样nulland

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

但如果只有第二个Specificationnull这个作品

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

因为方法参数可以是null

于 2020-01-31T21:31:06.543 回答