【发布时间】: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