[英]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
,我得到一個nullPointerException
從checkPackageAccess
解決時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
,如果第一Specification
是null
嘗試訪問的方法and
。 要清楚它看起來像這樣
Specification.where(null.and(getProdottoByIngSpec(ing)));
但是,如果只有第二個Specification
為null
此Specification
有效
Specification.where(getProdottoByLineaSpec(linea).and(null));
因為和方法參數可以為null
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.