使用命名方法dao.findByNameContains("hotel sheraton")
,我可以获取名称包括hotel sheraton
的酒店的列表。但是,如果旅馆的名称为sheraton hotel
,它将不会返回该旅馆。
因此,如果字符串包含单词列表,我想知道如何忽略单词的顺序进行搜索。
答案 0 :(得分:0)
您不能使用派生查询(即从方法名称派生的查询)来做到这一点。
可能最好的方法是使用Specification
s as described in the linked article。
然后,您可以使用一种方法,将String
的列表转换为Specification
,该列表是“相似”规范的组合:
public MySpecifications {
public static Specification<???> nameContains(String namePart) {
return new Specification<Customer> {
public Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb) {
return cb.like(root.get("name"), "%" + namePart + "%");
}
};
}
public static Specification<???> nameContainsAny(Collection<String> nameParts) {
Specification spec = Specification.where();
for (String namePart : nameParts) {
spec = spec.or(nameContains(String namePart)
}
return spec;
}
}
注意:代码中的错误仅供读者练习。