如何索引 Hibernate-search 中的继承字段?

How to index a inherited field in Hibernate-search?

我正在 java jpa Hibernate-search 应用程序中工作,我知道 Hibernate-search 会自动为实体中的每个 @Id 注释编制索引。问题是我有一个 "master domain" class 包含 @Id 注释,然后我有另一个 class 继承 "master domain",然后似乎是 Hibernate 搜索无法识别继承的 @Id 字段。

这是我的主域 class。

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

我有一个 class "Language" 继承了这个 class:

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

    @Field
    private String name;
}

最后我有另一个 class 叫做 "LanguageRelation",它与语言 class 有关。看起来像:

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

   @IndexedEmbedded
   private Language language;
}

因此,当我构建一个 lucene 查询来搜索 LanguageRelation 实体时,我能够像这样按语言名称进行搜索:

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

但我无法通过语言 ID 进行搜索,如下所示:

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

上次查询returns 0 个结果,如您所见,似乎是Hibernate 搜索无法识别从MasterDomain 继承的@Id,有什么建议吗?

更新 1 => 我忘了告诉 MasterDomain class 在我试图从中执行 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();

我认为问题很简单,默认情况下没有嵌入 ID。

尝试替换这个:

@IndexedEmbedded

有了这个:

@IndexedEmbedded(includeEmbeddedObjectId = true)

然后重新索引您的数据,并再次 运行 您的查询。