规范 OR 子句,in and isEmpty/isNull
Specification OR clause, in and isEmpty/isNull
我有具有能力(驾驶执照等)的工人,然后有一些机制需要某些能力。有时这些机制根本不需要权限。
目前我有一个带有 in 子句的规范可以正常工作,但我希望它也能发出不需要操作能力的机制。
public static Specification<Mechanism> hasCompetences(String searchTerm) {
return (root, query, criteriaBuilder) -> {
query.distinct(true);
List<String> list = new ArrayList<>(Arrays.asList(searchTerm.split(",")));
return root.join("competences").get("name").in(list);
};
}
如果我有 3 个能力像
汽车 | B 类 |
货车 | C 类 |
自行车 |(此处无数据) |
在请求 mechanisms?competences=B-Category
之后 returns 汽车如期而至,但我也想得到自行车。
或者有没有办法获得所有不需要权限的机制?我试过 mechanisms?competences=
但返回 []
。
编辑:
这是我现在所在的位置:
public static Specification<Mechanism> hasCompetences(List<String> list) {
return (root, query, cb) -> {
query.distinct(true);
return cb.or(
cb.isEmpty(root.join("competences")),
root.join("competences").get("name").in(list)
);
};
}
但是 isEmpty 给我这个错误:
java.lang.IllegalArgumentException: unknown collection expression type [org.hibernate.query.criteria.internal.path.SetAttributeJoin]
编辑2:
public static Specification<Mechanism> hasCompetences(List<String> list) {
return (root, query, cb) -> {
query.distinct(true);
Join<Mechanism, Set<Competence>> competences = root.join("competences", JoinType.LEFT);
return cb.or(
root.join("competences").get("name").in(list),
cb.isEmpty(competences)
);
};
}
错误:
unknown collection expression type [org.hibernate.query.criteria.internal.path.SetAttributeJoin];
您有 2 个错误:
- 匹配空集合的条件是
cb.isEmpty(root.get("competences"))
- 您需要指定左连接。
root.join("competences", JoinType.LEFT)
如果没有第二个修改,您将进行内部连接,因此您将永远不会检索具有空能力的机制。
更新
你求婚了
Join<Mechanism, Set<Competence>> competences = root.join("competences", JoinType.LEFT);
return cb.or(
root.join("competences").get("name").in(list),
cb.isEmpty(competences)
);
isEmpty
不适用于 SetAttributeJoin
(root.join
的结果)- 看点 1. 以上
尝试
Join<Mechanism, Set<Competence>> competences = root.join("competences", JoinType.LEFT);
return cb.or(
competences.get("name").in(list),
cb.isEmpty(root.get("competences"))
);
我有具有能力(驾驶执照等)的工人,然后有一些机制需要某些能力。有时这些机制根本不需要权限。
目前我有一个带有 in 子句的规范可以正常工作,但我希望它也能发出不需要操作能力的机制。
public static Specification<Mechanism> hasCompetences(String searchTerm) {
return (root, query, criteriaBuilder) -> {
query.distinct(true);
List<String> list = new ArrayList<>(Arrays.asList(searchTerm.split(",")));
return root.join("competences").get("name").in(list);
};
}
如果我有 3 个能力像
汽车 | B 类 |
货车 | C 类 |
自行车 |(此处无数据) |
在请求 mechanisms?competences=B-Category
之后 returns 汽车如期而至,但我也想得到自行车。
或者有没有办法获得所有不需要权限的机制?我试过 mechanisms?competences=
但返回 []
。
编辑:
这是我现在所在的位置:
public static Specification<Mechanism> hasCompetences(List<String> list) {
return (root, query, cb) -> {
query.distinct(true);
return cb.or(
cb.isEmpty(root.join("competences")),
root.join("competences").get("name").in(list)
);
};
}
但是 isEmpty 给我这个错误:
java.lang.IllegalArgumentException: unknown collection expression type [org.hibernate.query.criteria.internal.path.SetAttributeJoin]
编辑2:
public static Specification<Mechanism> hasCompetences(List<String> list) {
return (root, query, cb) -> {
query.distinct(true);
Join<Mechanism, Set<Competence>> competences = root.join("competences", JoinType.LEFT);
return cb.or(
root.join("competences").get("name").in(list),
cb.isEmpty(competences)
);
};
}
错误:
unknown collection expression type [org.hibernate.query.criteria.internal.path.SetAttributeJoin];
您有 2 个错误:
- 匹配空集合的条件是
cb.isEmpty(root.get("competences"))
- 您需要指定左连接。
root.join("competences", JoinType.LEFT)
如果没有第二个修改,您将进行内部连接,因此您将永远不会检索具有空能力的机制。
更新
你求婚了
Join<Mechanism, Set<Competence>> competences = root.join("competences", JoinType.LEFT);
return cb.or(
root.join("competences").get("name").in(list),
cb.isEmpty(competences)
);
isEmpty
不适用于 SetAttributeJoin
(root.join
的结果)- 看点 1. 以上
尝试
Join<Mechanism, Set<Competence>> competences = root.join("competences", JoinType.LEFT);
return cb.or(
competences.get("name").in(list),
cb.isEmpty(root.get("competences"))
);