规范 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 个错误:

  1. 匹配空集合的条件是cb.isEmpty(root.get("competences"))
  2. 您需要指定左连接。 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 不适用于 SetAttributeJoinroot.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"))
);