[英]Spring Data Specifications - how can I filter objects by mulitple attributes
我正在嘗試通過多個屬性來實現用戶搜索。 假設我的“人”具有“姓名”和“姓氏”。 我要輸入“ Michael Doe”並列出所有具有此名稱和姓氏的人。 當我只鍵入“ Michael”時,我想要所有Michaels,依此類推。
我試圖通過使用謂詞來使其成為可能:
private static Specification<UserEntity> containsTextInAttributes(List<String> text, List<String> attributes) {
List<String> finalTextArray = text.stream().map(e -> "%"+e+"%").collect(Collectors.toList());
return (root, query, builder) -> builder.or(root.getModel().getDeclaredSingularAttributes().stream()
.filter(a -> attributes.contains(a.getName()))
.map(a -> builder.or(finalTextArray.stream().map(e -> builder.like(root.get(a.getName()), e)).toArray(Predicate[]::new)))
.toArray(Predicate[]::new)
);
}
public static Specification<UserEntity> containsTextInAllAttributes(List<String> text) {
return containsTextInAttributes(text, Arrays.asList("lastname", "firstname", "email", "phoneNumber"));
}
但是,當我搜索“ Michael Doe”時,我所有的Michaels都與Lastname Doe在一起。如何解決我的問題?
預先感謝您的幫助。
I. "Michael D", "firstName", "lastName"
或"mdoe@gmail", "email"
public <T> Specification<T> dynamicLike(String likeValue, String... properties) {
return (Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
Expression<String> concat = null;
for (String property : properties) {
if (concat == null) {
concat = cb.concat("", root.get(property));
} else {
concat = cb.concat(concat, cb.concat(" ", root.get(property)));
}
}
return cb.like(cb.lower(concat), "%" + likeValue.toLowerCase() + "%");
};
}
二。 "Mic Do @gmail", "firstName", "lastName", "email"
public <T> Specification<T> dynamicLike2(String value, String... properties) {
return (Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
String[] values = value.split("\\s");
int minNumber = Integer.min(values.length, properties.length);
Predicate[] likes = new Predicate[minNumber];
for (int i = 0; i < minNumber; i++) {
likes[i] = cb.like(cb.lower(root.get(properties[i])), "%" + values[i].toLowerCase() + "%");
}
return cb.and(likes);
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.