У меня есть определенные поля, объявленные в базовом классе, и я хочу зарегистрировать эти поля только для определенных подклассов (сущностей).
Так что я не хочу аннотировать эти поля в базовом классе с помощью @Field и хотя достаточно просто программной регистрации для определенных объектов.
Но поля, объявленные в базовом объекте, не зарегистрированы / не сопоставлены с elasti c -search, и если попытаться выполнить поиск, он выдаст исключение ниже.
Я также пытался переместить это поле в сущности, а не объявлять его в базовом классе, и регистрация этих полей программно работает для меня, поэтому, только если поля в базовом классе не работают.
Вот мой пример кода
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)
Версии Hibernate, которые я использую,
hibernate-search -asticsearch, hibernate-search-orm = 5.11.4. Финал