休眠搜索:基类字段不会通过在休眠搜索中以编程方式注册字段来在弹性搜索中注册



我在基类中声明了某些字段,我只想为某些子类(实体(注册这些字段。

因此,我不想通过@Field来注释基类中的这些字段,尽管仅以编程方式为某些实体注册就足够了。

但是在基本实体中声明的字段没有注册/映射到弹性搜索,如果尝试搜索,那么它会抛出异常。

我还尝试将这些字段移动到实体本身,而不是在基类中声明它并以编程方式注册这些字段对我有用,因此仅当字段在基类中时才不起作用。

这是我的示例代码

public class BaseEntity{
@Column(name = "created_timestamp")
private String createdTimeStamp;
@Column(name = "created_by")
private ZonedDateTime createdBy;
//getter and setter
}
@Entity
@Indexed    
public class BookEntity extends BaseEntity{
//other fields
}
@Entity
@Indexed
public class PaperBookEntity extends BaseEntity{
//other fields
}
public class HibernateSearchFieldMappingService{
@Autowired
private SearchMapping searchMapping;
@Override
public <T extends BaseEntity> void registerAuditFields(Class<T> entityClass) {
LOG.info("Registering audit fields (createdTimeStamp and createdBy) of entity {}", entityClass);
IndexedMapping indexedMapping = searchMapping.entity(entityClass).indexed();
FieldMapping fieldMapping = indexedMapping.property("createdTimeStamp", ElementType.FIELD).field();
fieldMapping.dateBridge(Resolution.SECOND);
fieldMapping.sortableField();
indexedMapping.entity(entityClass).indexed().property("createdBy", ElementType.FIELD).field().normalizer("lowercase");
}
}

这是我的堆栈跟踪

org.hibernate.search.exception.SearchException: Unable to find field createdBy in com.*.*.*.BookEntity
at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.objectToString(DocumentBuilderIndexedEntity.java:1052)
at org.hibernate.search.query.dsl.impl.FieldContext.objectToString(FieldContext.java:75)
at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.buildSearchTerm(ConnectedMultiFieldsTermQueryBuilder.java:149)
at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:113)
at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:72)

我使用的休眠版本是,

休眠搜索弹性搜索,休眠搜索ORM = 5.11.4.Final

Hibernate Search 5 中的编程 API 不识别"继承"属性,仅识别直接在要映射的类型上声明的属性。参见 HSEARCH-1108。

该问题已在Hibernate搜索6中解决,因此您可以通过升级来解决它。请注意,Hibernate Search 6 处于测试阶段,API 完全不同。有关入门指南,请参阅此处。

要在 Hibernate Search 5 中执行此操作而不升级到 6,通常的解决方案不是使用编程 API,而是在您希望显示字段的类中覆盖 getter,并注释被覆盖的 getter。

例如:

@MappedSuperclass
public class BaseEntity{
@Column(name = "created_by")
private String createdBy;
@Column(name = "created_timestamp")
private ZonedDateTime createdTimeStamp;
public String getCreatedBy() {
return createdBy;
}
public String getCreatedTimeStamp() {
return createdTimeStamp;
}
}
@Entity
@Indexed    
public class BookEntity extends BaseEntity{
@Override
@Field(normalizer = @Normalizer(definition = "lowercase"))
public String getCreatedBy() {
return super.getCreatedBy();
}
@Override
@Field
@SortableField
public String getCreatedTimeStamp() {
return createdTimeStamp;
}
}
@Column(name = "created_timestamp")
private String createdBy;
@Column(name = "created_by")
private ZonedDateTime createdTimeStamp;

不应该是

@Column(name = "created_timestamp")
private String createdTimeStamp;;
@Column(name = "created_by")
private ZonedDateTime createdBy

另一个假设 **列名created_by改为创建者

最新更新