jpa 从循环添加规范

n3h0vuf2  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(143)

在spring Boot 3应用程序中,我尝试使用规范

public Page<User> advancedSearch(UserSearch search, Pageable page) {

      String[] splittedValues = search.name.split(" ");
    

      Specification<User> hasPersonWithName = (Root<User> root, CriteriaQuery<?> cq, CriteriaBuilder cb) -> {

            ...

            return pre;
        };

    return findAll(specification, page);

}

我需要为splittedValues中的每个值添加一个全局规范

for (String splittedName: splittedValues) {
   specification.or(splittedName);
}

并将其传递给findAll
我不知道该怎么做
编辑
你的解决方案看起来很有效
这产生了

where
    1=1 
    or like e1_0.name "%bob%"
    or like e1_0.name "%jame%"

这是一种方法

where
    1=1 
    and (
    like e1_0.name "%bob%"
    or like e1_0.name "%jame%"
    )
bkhjykvo

bkhjykvo1#

使用or运算符,可以合并多个条件,检查Username是否包含splittedValues之一。然后从规范中返回 predicate 。
我希望这是你想要的,如果我不明白,请纠正我。这里是一个例子,如果是这样,适应自己的代码。
编辑:要得到1=1 and (like e1_0.name "%bob%" or like e1_0.name "%jame%"),可以使用cb.or方法合并条件,然后使用cb.and将得到的nameConditionspre组合。

public Page<User> advancedSearch(UserSearch search, Pageable page) {
    String[] splittedValues = search.name.split(" ");

    Specification<User> hasPersonWithName = (Root<User> root, CriteriaQuery<?> cq, CriteriaBuilder cb) -> {
        Predicate pre = cb.conjunction();
        Predicate nameConditions = null;
        for (String splittedName: splittedValues) {
            if (nameConditions == null) {
                nameConditions = cb.like(root.get("name"), "%" + splittedName + "%");
            } else {
                nameConditions = cb.or(nameConditions, cb.like(root.get("name"), "%" + splittedName + "%"));
            }
        }
        if (nameConditions != null) {
            pre = cb.and(pre, nameConditions);
        }
        return pre;
    };

返回findAll(有名字的人,第页);}

相关问题