簡體   English   中英

JPA 規范和 .where 子句中的空參數

[英]JPA Specification and null parameter in .where clause

我寫了兩個規范,如果它們的參數為 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;
    }

然后我創建了第三個,將前一個與where子句中的and運算符結合起來:

public static Specification<Prodotto> getProdottoByMainTraits (String linea, String ing) {

        return Specification.where(getProdottoByLineaSpec(linea).and(getProdottoByIngSpec(ing)));
    }

現在,這是有趣的部分:

  • 如果ByLinea返回null ,我得到一個nullPointerExceptioncheckPackageAccess解決時where的條款。
  • 如果ByIng返回null ,它只會被忽略(就像它應該的那樣)並且查詢只匹配另一個謂詞。
  • 如果我切換兩個謂詞,將ByIng作為第一個,然后將ByLinea放在where子句中,則所有組合都適用。

避免從方法中返回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 + "%");            
    }
}

PS你得到NullPointerException ,如果第一Specificationnull嘗試訪問的方法and 要清楚它看起來像這樣

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

但是,如果只有第二個SpecificationnullSpecification有效

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

因為方法參數可以為null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM