Spring数据JPA搜索忽略单词顺序

时间:2018-08-16 18:44:43

标签: spring-boot spring-data-jpa

使用命名方法dao.findByNameContains("hotel sheraton"),我可以获取名称包括hotel sheraton的酒店的列表。但是,如果旅馆的名称为sheraton hotel,它将不会返回该旅馆。

因此,如果字符串包含单词列表,我想知道如何忽略单词的顺序进行搜索。

1 个答案:

答案 0 :(得分:0)

您不能使用派生查询(即从方法名称派生的查询)来做到这一点。

可能最好的方法是使用Specifications 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;
    }
}

注意:代码中的错误仅供读者练习。