Для моего веб-приложения мне нужно реализовать полнотекстовый поиск - поскольку я уже использую Hibernate с Spring Data JPA (поверх Spring Boot) Я решил реализовать Hibernate Искать полный текст Люцен. Все работает так, как ожидалось, но после внедрения Hibernate Search я начал получать предупреждения:Сбой гибернации Критерий устаревания после внедрения Hibernate Search
Hibernate's legacy org.hibernate.Criteria API устарел; использовать JPA javax.persistence.criteria.CriteriaQuery вместо
Я не использую Criteria API для моих Hibernate Search запросов (как это обескураживает 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();
}
Любое использование этих результатов полнотекстового поиска в предупреждении о признаке API API.
Использует ли он устаревший API критериев под капотом? Если да, то почему Hibernate Search использует API, который Hibernate устарел? На самом деле, я также получил некоторые предупреждения об устаревании при запуске приложения, когда я звоню
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
для начальной индексации.
Примечания: Я использую спецификацию Springs в другой части приложения, которую я ожидаю, может использовать API-интерфейс критериев под капотом, но я не получаю предупреждения об устаревании при его использовании, а также не получал предупреждения раньше Был добавлен поиск в спящий режим.
EntityManager получен путем инъекции @PersistanceContext
.
Я хотел бы избавиться от устаревших API-интерфейсов, если это возможно, но я не понимаю, где в этом случае используется API-интерфейс Criteria, и даже если его можно изменить на JPA CriteriaQuery (поскольку я его не использую явно).
Мои зависимости с версиями, которые я думаю, может быть важным:
- гибернации-ядро: 5.2.5.Final
- гибернации-поиск-ОРМ: 5.7.0.Beta2
Кроме того, с помощью некоторых дополнительных зависимостей для анализаторов:
- Solr-анализ-дополнения: 5.5.2
- Lucene-анализаторы-Stempel: 5.5.2
Ой, ладно. Таким образом, Hibernate Search действительно использует устаревший API критериев внутри страны. Затем я буду придерживаться его и игнорировать предупреждения, поскольку это не влияет на мою функциональность.Спасибо, что разъяснил это. – Plebejusz
Правильно, это просто предупреждение, поскольку мы в конечном итоге удалим его в будущих выпусках Hibernate ORM, но «устаревшие критерии» все еще работают нормально и все равно будут поддерживаться некоторое время. – Sanne