HSEARCH000135错误:无法推测FieldBridge问题咨询(Hibernate 5.6.3.Final)
解决HSEARCH000135: Unable to guess FieldBridge for type错误的方法
解决方案
方法1:通过@IndexedEmbedded + @Field映射嵌入式字段
在实体A的type字段上添加@IndexedEmbedded,同时在TypeValue的value字段上添加@Field,让Hibernate Search自动解析嵌入式对象的字段:
修改实体A的字段:
@Embedded @AttributeOverrides(@AttributeOverride(name = "value", column = @Column(name = "TYPE"))) @IndexedEmbedded private TypeValue type;
修改TypeValue类:
@Embeddable public class TypeValue { @Field private String value; // 原构造器、getter、setter代码保持不变 }
这种方式会将TypeValue的value作为实体A索引的子字段(默认路径为type.value),如需自定义字段名,可在@Field中指定name属性。
方法2:自定义FieldBridge直接转换
如果只需要将TypeValue的value作为实体A的普通索引字段,可自定义FieldBridge提取值:
- 自定义FieldBridge实现类:
import org.hibernate.search.bridge.FieldBridge; import org.hibernate.search.bridge.LuceneOptions; import org.apache.lucene.document.Document; public class TypeValueBridge implements FieldBridge { @Override public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { if (value != null) { TypeValue typeValue = (TypeValue) value; luceneOptions.addFieldToDocument(name, typeValue.getValue(), document); } } }
- 在实体A的
type字段上关联该Bridge:
@Embedded @AttributeOverrides(@AttributeOverride(name = "value", column = @Column(name = "TYPE"))) @Field(bridge = @FieldBridge(impl = TypeValueBridge.class)) private TypeValue type;
方法3:通过属性访问直接映射值
在实体A中添加返回TypeValue的value的方法,并在该方法上添加@Field注解:
@Embedded @AttributeOverrides(@AttributeOverride(name = "value", column = @Column(name = "TYPE"))) private TypeValue type; // 新增方法用于索引映射 @Field(name = "type") // 可自定义索引字段名 public String getTypeValue() { return type != null ? type.getValue() : null; } // 若Hibernate默认使用字段访问,需添加@AccessType确保属性访问生效 // @AccessType("property")
错误原因
Hibernate Search无法自动推测TypeValue类型的FieldBridge,因为它是自定义的嵌入式值对象,不属于框架默认支持的基本类型或可自动解析的类型,必须通过显式注解告知框架如何将该对象转换为可索引的字段值。
内容的提问来源于stack exchange,提问作者wtomko
相关产品推荐
相关产品推荐

