根据模式列表测试字符串值的规范

问题描述 投票:0回答:1

我很难定义一个规范来根据模式列表测试字符串值。

@Entity
@Table(name = "glossary")
@Schema(description = "Glossary term")
public class Term {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Schema(accessMode = Schema.AccessMode.READ_ONLY, description = "Company ID")
    private long id;

    @Schema(description = "Glossary term")
    private String keyword;
}

在上面的课程中,我定义了一个针对单个模式进行测试的规范,一个针对字符串列表测试相等性的规范,另一个针对单个字符串测试相等性的规范。

public static Specification<Term> hasKeywordLike(String keyword) {
    return (root, query, criteriaBuilder) -> criteriaBuilder.like(criteriaBuilder.lower(root.get("keyword")), "%" + keyword.toLowerCase() + "%");
}

public static Specification<Term> hasKeywords(List<String> keywords) {
    return (root, query, criteriaBuilder) -> criteriaBuilder.lower(root.get("keyword")).in(keywords.stream().map(String::toLowerCase).toList());
}

public static Specification<Term> hasKeyword(String keyword) {
    return (root, query, criteriaBuilder) -> criteriaBuilder.equal(criteriaBuilder.lower(root.get("keyword")), keyword.toLowerCase());
}

我不知道如何创建一个规范来根据模式列表测试字符串值。

java spring spring-data-jpa criteria-api specification-pattern
1个回答
0
投票

我创建了多个谓词,每个谓词对应一个谓词,然后通过逻辑或将它们组合起来。作为归约的标识值,我使用了析取谓词,默认情况下为 false。

public static Specification<Term> hasKeywordsLike(List<String> keywords) {
    return (root, query, criteriaBuilder) -> keywords
            .stream()
            .map(keyword -> criteriaBuilder.like(criteriaBuilder.lower(root.get("keyword")), "%" + keyword.toLowerCase() + "%"))
            .reduce(criteriaBuilder.disjunction(), criteriaBuilder::or);
}
© www.soinside.com 2019 - 2024. All rights reserved.