实施 Hibernate Search 后出现 Hibernate Criteria 弃用警告

Hibernate Criteria deprecation warrning after implementing Hibernate Search

对于我的 Web 应用程序,我必须实施全文搜索 - 因为我已经在使用 Hibernate 和 Spring Data JPA(在 Spring Boot 之上)我决定实施 Hibernate Search for全文 Lucene 查询。一切都按预期工作,但在实施 Hibernate Search 后我开始收到警告:

Hibernate's legacy org.hibernate.Criteria API is deprecated; use the JPA javax.persistence.criteria.CriteriaQuery instead

我的 Hibernate Search 查询没有使用 Criteria API(因为 Hibernate Search 文档不鼓励这样做),我的查询代码基本上如下所示:

import org.apache.lucene.search.Query;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.Search;
import org.hibernate.search.query.dsl.BooleanJunction;
import org.hibernate.search.query.dsl.QueryBuilder;

...

@Override
@Transactional
public List<Picture> fullTextSearchByCriteria(List<SearchCriteria> criteria, String pageString) {
    final FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
    final QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Picture.class).get();
    final Query luceneQuery = buildFromCriteria(queryBuilder, criteria);
    final FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Picture.class);

    /* some fine tunning here with calls to .setFirstResult(), .setMaxResults() and 
       .getResultSize() for pagination. It's used for page wrapper that I omitted here for simplicity sake */

    return jpaQuery.getResultList()
}

buildFromCriteria(queryBuilder, criteria) 是一种构建布尔连接的方法(另外 SearchCriteria class 只是一个普通的 POJO,那里没什么有趣的)。此方法如下所示:

@Transactional
private Query buildFromCriteria(QueryBuilder queryBuilder, List<SearchCriteria> criteria) {
    if (criteria == null)
        return queryBuilder.all().createQuery();

    BooleanJunction<BooleanJunction> junction = queryBuilder.bool();
    for (SearchCriteria c : criteria) {
        junction.must(
                queryBuilder
                        .keyword()
                        .onField(c.getField())
                        .matching(c.getValue())
                        .createQuery()
        );
    }
    return junction.createQuery();
}

每次使用此全文搜索都会导致标准 API 弃用警告。

它是否在幕后使用了已弃用的标准 API?如果是这样,为什么 Hibernate Search 会使用 Hibernate 弃用的 API?实际上,当我调用

时,我在应用程序启动时也收到了一些弃用警告
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();

用于初始索引。

注意:我在应用程序的其他部分使用 Springs 规范,我希望它可以在引擎盖下使用 Criteria API,但我在使用时没有收到弃用警告它并且在添加 Hibernate Search 之前也没有收到任何警告。

EntityManager是通过@PersistanceContext注入获得的。

如果可能,我想摆脱已弃用的 API 用法,但我不明白在这种情况下 Criteria API 的使用位置,以及是否有可能将其更改为 JPA CriteriaQuery(因为我没有明确使用它)。

我认为可能重要的版本依赖关系:

还为分析器使用了一些额外的依赖项:

将 Hibernate Search 转换为 Hibernate ORM 的最新更改是一项复杂的工作。 您正在点击 HSEARCH-2381