如何索引 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)
然后重新索引您的数据,并再次 运行 您的查询。
我正在 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)
然后重新索引您的数据,并再次 运行 您的查询。