【问题标题】:How to index a inherited field in Hibernate-search?如何在 Hibernate-search 中索引继承的字段?
【发布时间】:2019-10-21 15:32:44
【问题描述】:

我在 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;
}

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

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

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

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

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

更新 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();

【问题讨论】:

  • 您是否尝试声明“private Key id;”作为受保护而不是私有?
  • 据我所知,这应该可以正常工作。您使用的是哪个版本的 Hibernate Search?您查询代码中languageId 变量的类型是什么?
  • @Stefania 我将 id 修饰符更改为“受保护”,但结果是一样的,我忘了指定我拥有属性的所有访问方法。
  • @yrodiere languageId 是 Long 类型,我使用的是 5.11.2.Final 版本。行为很奇怪,我想是因为我是从抽象类继承的?或者我需要在“Id”属性上添加另一个注释?
  • 最可能的解释是生成了错误类型的查询。请添加您的查询的完整代码,尤其包括您如何创建 queryBuilder。

标签: java lucene hibernate-search


【解决方案1】:

我认为问题只是默认情况下没有嵌入 ID。

尝试替换这个:

@IndexedEmbedded

有了这个:

@IndexedEmbedded(includeEmbeddedObjectId = true)

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

【讨论】:

  • 这拯救了我的一天。我在任何地方都没有找到这个调整。谢谢 :) 但还有一个疑问,每次我查询@IndexedEmbedded 实体的 ID 时,都会触发单个 SQL 查询。这是正确的行为吗?我使用 Luke 检查了索引,它们看起来不错。
  • 我不明白您所说的“我查询 @IndexedEmbedded 实体的 ID”是什么意思。也许有一些代码的新问题是为了?
  • 我的意思是,我将其理解为“我在 ID 上应用谓词”,但这与 SQL 查询无关,因此您可能指的是其他意思。是的,日志中的代码示例会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多