如何在Hibernate搜索中索引继承的字段?

问题描述 投票:0回答:1

我正在Java jpa Hibernate搜索应用程序中工作,我知道Hibernate搜索索引会自动为实体中的每个@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;
}

我有一个继承于该类的“语言”类:

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

    @Field
    private String name;
}

最后,我还有一个名为“ LanguageRelation”的类,它与Language类有关。看起来像:

@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()

先前的查询返回0个结果,如您所见,似乎Hibernate搜索无法识别从MasterDomain继承的@Id,有任何建议吗?

UPDATE 1 =>我忘了告诉MasterDomain类在试图执行Lucene查询的单独模块中。也许这可能会引起问题?

UPDATE 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();
java lucene hibernate-search
1个回答
0
投票

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

尝试替换此:

@IndexedEmbedded

使用此:

@IndexedEmbedded(includeEmbeddedObjectId = true)

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

© www.soinside.com 2019 - 2024. All rights reserved.