2

Для моего веб-приложения мне нужно реализовать полнотекстовый поиск - поскольку я уже использую 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

ответ

3

Конверсия Hibernate Поиск по последним изменениям Hibernate ORM является сложным в процессе разработки. Вы наносите HSEARCH-2381.

+0

Ой, ладно. Таким образом, Hibernate Search действительно использует устаревший API критериев внутри страны. Затем я буду придерживаться его и игнорировать предупреждения, поскольку это не влияет на мою функциональность.Спасибо, что разъяснил это. – Plebejusz

+0

Правильно, это просто предупреждение, поскольку мы в конечном итоге удалим его в будущих выпусках Hibernate ORM, но «устаревшие критерии» все еще работают нормально и все равно будут поддерживаться некоторое время. – Sanne