我在基类中声明了某些字段,并且我只想为某些子类(实体)注册这些字段。
因此,我不想用@Field注释基类中的那些字段,尽管仅通过编程方式为某些实体注册就足够了。
但是在基本实体中声明的字段未注册/映射到弹性搜索,如果尝试搜索,它将抛出以下异常。
我也尝试过将这些字段移到实体本身,而不是在基类中声明它并以编程方式注册这些字段,这对我来说是有效的,因此,仅当这些字段在基类中不起作用时。
这是我的示例代码
public class BaseEntity{
@Column(name = "created_timestamp")
private String createdBy;
@Column(name = "created_by")
private ZonedDateTime createdTimeStamp;
//getter and setter
}
@Entity
@Indexed
public class BookEntity extends BaseEntity{
//other fields
}
@Entity
@Indexed
public class BookEntity 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)
我使用的休眠版本是,
hibernate-search-elasticsearch,hibernate-search-orm = 5.11.4.Final
@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而不是createdBy