我在基类中声明了某些字段,我只想为某些子类(实体)注册这些字段。
这样,我就不想用@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)我使用的Hibernate版本是,
hibernate-搜索-elasticsearch,hibernate-搜索-orm=5.11.4
发布于 2020-02-11 07:24:25
Hibernate搜索5中的编程API不识别“继承”属性,只有直接在映射类型上声明的属性。见HSEARCH 1108。
这个问题已经在Hibernate搜索6中解决了,所以您可以通过升级来解决它。请注意,Hibernate搜索6在Beta中,而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;
}
}发布于 2020-02-11 05:12:57
@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
https://stackoverflow.com/questions/60162311
复制相似问题