使用MYSQL进行Spring JPA规范全文搜索

时间:2018-01-09 02:53:38

标签: java mysql spring spring-data-jpa jpa-criteria

我正在尝试使用Spring JPA规范创建全文搜索。我想要完成的查询如下。

SELECT * FROM Station WHERE MATCH(Slogan, Description) AGAINST('searchText' IN BOOLEAN MODE);

如何在Spring JPA规范中编写此查询,该规范允许我传入“searchText”值?这是我迄今为止的尝试。

public static Specification<Station> fullTextSearch(String searchText) {
    if (searchText == null) {
        return null;
    }

    return (Root<Station> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {

        List<Predicate> predicates = new ArrayList<>();
        Expression<Double> match = cb.function("match", Double.class,
                root.get("description"),
                cb.parameter(String.class, "searchText"));

        // TODO: How do I set "searchText"?????

        predicates.add(cb.greaterThan(match, 0.));
        return cb.and(predicates.toArray(new Predicate[]{}));
    };
}

然后可以通过调用:

来使用它
 Specifications<Station> spec = Specifications.where(StationSpecifications.fullTextSearch(query));
 stationRepository.findAll(spec, pageable);

我第一次尝试使用的文章: http://pavelmakhov.com/2016/09/jpa-custom-function

2 个答案:

答案 0 :(得分:1)

看起来Jpa规范API不允许这样做。预测方法(Root root,CriteriaQuery查询,CriteriaBuilder cb)有一个查询参数,它不会注入一个参数,它不兼容。而且您无法访问entityManager。 如何使用本机MySQL查询(请注意nativeQuery = true):

@Query(value = "SELECT * FROM accounts WHERE (COALESCE(first_name,'') LIKE %:firstName% AND COALESCE(last_name,'') LIKE %:lastName%)", nativeQuery = true)
public List<Account> searchByFirstnameAndLastname(@Param("firstName")String firstName,@Param("lastName")String lastName);

答案 1 :(得分:1)

我提出的解决方案并不理想,但基于@dimirsen的建议。可分页对象将添加到查询中,并按预期工作。

@Query(value = "SELECT * FROM Station s WHERE MATCH(s.slogan, s.description) AGAINST(?1 IN BOOLEAN MODE) ORDER BY ?#{#pageable}",
        countQuery = "SELECT * FROM Station s WHERE MATCH(s.slogan, s.description) AGAINST(?1 IN BOOLEAN MODE)",
        nativeQuery = true)
Page<Station> fullTextSearch(String searchText, Pageable pageable);