Я написал две спецификации, которые возвращают 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
, все будет работать в любой комбинации.