首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate-搜索:通过编程在hibernate-search中注册字段,基类字段不会在弹性搜索中注册。

hibernate-搜索:通过编程在hibernate-search中注册字段,基类字段不会在弹性搜索中注册。
EN

Stack Overflow用户
提问于 2020-02-11 05:04:03
回答 2查看 167关注 0票数 0

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

这样,我就不想用@Field来注释基类中的那些字段了,尽管只是以编程的方式为某些实体注册已经足够了。

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

我还尝试将这些字段移动到实体本身,而不是在基类中声明该字段,并以编程方式注册这些字段,因此只有当字段位于基类时才能正常工作。

这是我的示例代码

代码语言:javascript
复制
public class BaseEntity{

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

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

//getter and setter

}
代码语言:javascript
复制
@Entity
@Indexed    
public class BookEntity extends BaseEntity{

//other fields
}
代码语言:javascript
复制
@Entity
@Indexed
public class PaperBookEntity extends BaseEntity{

//other fields
}
代码语言:javascript
复制
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");
  }

  }

这是我的堆栈跟踪

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2020-02-11 07:24:25

Hibernate搜索5中的编程API不识别“继承”属性,只有直接在映射类型上声明的属性。见HSEARCH 1108

这个问题已经在Hibernate搜索6中解决了,所以您可以通过升级来解决它。请注意,Hibernate搜索6在Beta中,而API则非常不同。有关入门指南,请参阅这里

要在Hibernate Search 5中不升级到6,通常的解决方案不是使用编程API,而是覆盖希望字段出现的类中的getter,并对重写的getter进行注释。

例如:

代码语言:javascript
复制
@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;
}
}
代码语言:javascript
复制
@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;
}
}
票数 1
EN

Stack Overflow用户

发布于 2020-02-11 05:12:57

代码语言:javascript
复制
@Column(name = "created_timestamp")
private String createdBy;

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

不是应该吗

代码语言:javascript
复制
@Column(name = "created_timestamp")
private String createdTimeStamp;;

@Column(name = "created_by")
private ZonedDateTime createdBy

另一个假设**列名是created_by而不是createdBy

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60162311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档