实施 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(因为我没有明确使用它)。
我认为可能重要的版本依赖关系:
- 休眠核心:5.2.5.Final
- hibernate-search-orm: 5.7.0.Beta2
还为分析器使用了一些额外的依赖项:
- solr-analysis-extras: 5.5.2
- lucene-analyzers-stempel: 5.5.2
将 Hibernate Search 转换为 Hibernate ORM 的最新更改是一项复杂的工作。
您正在点击 HSEARCH-2381。
对于我的 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(因为我没有明确使用它)。
我认为可能重要的版本依赖关系:
- 休眠核心:5.2.5.Final
- hibernate-search-orm: 5.7.0.Beta2
还为分析器使用了一些额外的依赖项:
- solr-analysis-extras: 5.5.2
- lucene-analyzers-stempel: 5.5.2
将 Hibernate Search 转换为 Hibernate ORM 的最新更改是一项复杂的工作。 您正在点击 HSEARCH-2381。