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

时间:2020-01-31 18:59:14

标签: jpa null spring-data-jpa specification-pattern

我写了两个规范,如果它们的参数为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子句中,则所有组合都可以工作。

1 个答案:

答案 0 :(得分:3)

避免从方法中返回List<List<int>> result = new List<List<int>>(); 是一个好习惯。

您可以使用nullconjunction()忽略criteriaBuilder参数null。它总是产生Specification true。有相反的方法Predicatedisjunction()

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));