我很难定义一个规范来根据模式列表测试字符串值。
@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());
}
我不知道如何创建一个规范来根据模式列表测试字符串值。
我创建了多个谓词,每个谓词对应一个谓词,然后通过逻辑或将它们组合起来。作为归约的标识值,我使用了析取谓词,默认情况下为 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);
}