我正在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();
我认为问题很简单,默认情况下未嵌入ID。
尝试替换此:
@IndexedEmbedded
使用此:
@IndexedEmbedded(includeEmbeddedObjectId = true)
然后重新索引数据,然后再次运行查询。