gpt4 book ai didi

java - 实现 Hibernate Search 后的 Hibernate Criteria 弃用警告

转载 作者:行者123 更新时间:2023-11-30 07:56:37 26 4
gpt4 key购买 nike

对于我的 Web 应用程序,我必须实现全文搜索 - 因为我已经在使用 Hibernate 和 Spring Data JPA(在 Spring Boot 之上),所以我决定为全文 Lucene 查询实现 Hibernate 搜索。一切都按预期工作,但在实现 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) 是一种构建 boolean 连接的方法(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注入(inject)获取的。

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

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

  • hibernate 核心: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 .

关于java - 实现 Hibernate Search 后的 Hibernate Criteria 弃用警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com