4ja*_*ier 0 null jpa specification-pattern spring-data-jpa
我写了两个规范,如果它们的参数为 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;
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了第三个,将前一个与子句中的and运算符结合起来where:
public static Specification<Prodotto> getProdottoByMainTraits (String linea, String ing) {
return Specification.where(getProdottoByLineaSpec(linea).and(getProdottoByIngSpec(ing)));
}
Run Code Online (Sandbox Code Playgroud)
现在,这是有趣的部分:
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 + "%");
}
}
Run Code Online (Sandbox Code Playgroud)
PS你得到NullPointerException,如果第一个Specification是null试图访问一个方法and。要清楚它看起来像这样
Specification.where(null.and(getProdottoByIngSpec(ing)));
Run Code Online (Sandbox Code Playgroud)
但如果只有第二个Specification是null这个工作
Specification.where(getProdottoByLineaSpec(linea).and(null));
Run Code Online (Sandbox Code Playgroud)
因为和方法参数可以是null
| 归档时间: |
|
| 查看次数: |
5955 次 |
| 最近记录: |