Нет, в настоящее время невозможно создать безопасный тип FullTextQuery
(причины приведены ниже). Рекомендуемый подход, который будет хорошо работать с Search 5.10, а также со старыми (до 5.7) версиями:
QueryBuilder queryBuilder = fullTextSession
.getSearchFactory()
.buildQueryBuilder()
.forEntity(Entity.class)
.get();
org.apache.lucene.search.Query luceneQuery = queryBuilder
.keyword()
.onField("field")
.matching("value")
.createQuery();
FullTextQuery query = fullTextSession.createFullTextQuery(luceneQuery, Entity.class);
List<Entity> result = (List<Entity>) query.list();
Почему?
Возможность создания безопасного типа запроса является довольно новой по стандартам ORM: она шла с JPA 2.1 (ORM 5.2). До этого метод list()
использовался для возврата необработанного List
(без параметров универсального типа) в ORM, как и в запросах Hibernate Search.
Поиск Hibernate не изменился, чтобы следовать ORM, хотя: FullTextQuery
расширяет org.hibernate.query.Query
как необработанный тип, без каких-либо параметров. Причина в том, что в объекте FullTextQuery
имеются мутаторы, которые позволяют изменять возвращаемые объекты и, следовательно, возвращаемый тип (в частности, метод setProjection
). Так что, хотя мы могли бы вернуть FullTextQuery<Entity>
при создании запроса, это могло бы ввести в заблуждение, поскольку в некоторых случаях вы могли бы получить FullTextQuery<Entity>
, который фактически возвращает результаты типа List<Object[]>
.
Мы исследовали несколько вариантов решения этой ситуации, но не смогли найти решение, которое одновременно гарантировало бы безопасность типов и позволяло бы сохранить обратную совместимость. Итак, мы отказались от этого для Hibernate Search 5.
Если вам интересно, у ORM такой же проблемы нет, потому что вы указываете точный тип, который вы хотите, чтобы ваш запрос возвращал при создании запроса, и не можете изменить его впоследствии.
В следующей версии Hibernate Search, версии 6, это будет решено, однако. Новые API построения запросов требуют указания того, будет ли запрос возвращать управляемые объекты или проекции индекса до того, как создаст запрос. Hibernate Search 6 еще не стабилен и не готов к работе, но если вам интересно, вы можете найти пример здесь (вызов asEntity
сообщает Search, каким должен быть тип возвращаемого значения).