对于我的Web应用程序,我必须实现全文搜索 - 因为我已经在使用Spring Data JPA的Hibernate(在Spring Boot之上)我决定实现Hibernate Search以查看全文Lucene查询。一切都按预期工作,但在实施Hibernate Search后,我开始收到警告:
不推荐使用Hibernate的旧版org.hibernate.Criteria API;使用 而是JPA javax.persistence.criteria.CriteriaQuery
我没有对我的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
类只是一个普通的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();
}
此全文搜索的每次使用都会导致Criteria API弃用警告。
它是否在引擎盖下使用弃用的Criteria API?如果是这样,为什么Hibernate Search会使用Hibernate弃用的API?实际上,当我打电话给
时,我也会在应用程序启动时收到一些弃用警告FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
用于初始索引。
注意:我在应用程序的其他部分使用Springs Specification,我希望可以使用Criteria API,但是在使用它时我没有得到弃用警告,并且在Hibernate之前也没有得到任何警告搜索已添加。
EntityManager是通过@PersistanceContext
注入获得的。
如果可能的话,我想摆脱不推荐使用的API用法,但我不明白在这种情况下使用Criteria API的地方,以及是否可以将其更改为JPA CriteriaQuery(因为我没有明确地使用它) )。
我对我认为可能很重要的版本的依赖:
还为分析仪使用了一些额外的依赖项: