对于我的Web应用程序,我必须实现全文搜索-因为我已经在Spring Data JPA中使用Hibernate(在Spring Boot之上),所以我决定为全文Lucene查询实现Hibernate Search。一切都按预期进行,但是在实施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 Search之前也没有收到任何警告。 。
EntityManager是通过@PersistanceContext
注入获得的。
如果可能,我想摆脱不推荐使用的API用法,但是我不了解在这种情况下在哪里使用Criteria API,以及是否有可能将其更改为JPA CriteriaQuery(因为我没有明确使用它)。
我对我认为可能很重要的版本的依赖:
还为分析器使用了一些额外的依赖项:
从Hibernate Search到Hibernate ORM的最新更改的转换是一项复杂的工作。您正在点击HSEARCH-2381。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句