Как проиндексировать унаследованное поле в Hibernate-поиске? - PullRequest
0 голосов
/ 21 октября 2019

Я работаю в java jpa-приложении Hibernate-search, я знаю индекс Hibernate-search автоматически при каждой аннотации @Id в объекте. Проблема в том, что у меня есть класс «главный домен» с аннотацией @Id, а затем у меня есть другой класс с наследованным «основным доменом», тогда, похоже, что поиск Hibernate не распознает унаследованное поле @Id.

это мой класс основного домена.

@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class MasterDomain<Key extends Object> implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;
}

У меня есть класс "Language", который наследует этот класс:

@Indexed
@Entity
public class Language extends MasterDomain<Long>{

    @Field
    private String name;
}

Наконец, у меня есть другой класс с именем "LanguageRelation"который связан с языковым классом. Это выглядит так:

@Indexed
@Entity
public class LanguageRelation extends MasterDomain<Long>{

   @IndexedEmbedded
   private Language language;
}

Итак, когда я создаю запрос lucene для поиска сущностей LanguageRelation, я могу искать по названию языка следующим образом:

queryBuilder.keyword().onField("language.name").matching(languageName).createQuery()

Но я невозможность поиска по идентификатору языка, например:

queryBuilder.keyword().onField("language.id").matching(languageId).createQuery()

Предыдущий запрос возвращает 0 результатов, как вы можете видеть, похоже, что Hibernate-поиск не распознает @Id, унаследованный от MasterDomain, какое-либо предложение?

UPDATE 1 => Я забыл сказать, что класс MasterDomain находится в отдельном модуле, из которого я пытаюсь выполнить запрос Lucene. Может быть, это может привести к проблеме?

ОБНОВЛЕНИЕ 2 Это полный код того, как я пытаюсь построить свой запрос Lucene.

FullTextEntityManager fullTextEntityManager
                = Search.getFullTextEntityManager(entityManager);

org.hibernate.search.query.dsl.QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory()
                .buildQueryBuilder()
                .forEntity(LanguageRelation.class)
                .get();

Long languageId = 29L;
org.apache.lucene.search.Query query = queryBuilder.keyword().onField("language.id").matching(languageId).createQuery();

org.hibernate.search.jpa.FullTextQuery fullTextQuery
                = fullTextEntityManager.createFullTextQuery(query, LanguageRelation.class);
List<LanguageRelation> resultList = fullTextQuery.getResultList();

1 Ответ

1 голос
/ 22 октября 2019

Я думаю, проблема в том, что идентификатор не встроен по умолчанию.

Попробуйте заменить это:

@IndexedEmbedded

На это:

@IndexedEmbedded(includeEmbeddedObjectId = true)

Затем переиндексируйте данные и снова выполните запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...