Hibernate:如何注释 Collection<Object> 以允许搜索

Hibernate: how to annotate Collection<Object> to allow search

假设我有一个像这样的模型 A:

@Embeddable
class A {
    @Field
    private String name;
    @Field
    private Boolean editable;
    @IndexedEmbedded
    private B bObject;
}

其中,B 是,比方说

@Embeddable
class B {
    @Field
    private int intValue;
    @Field
    private boolean boolValue;
}

现在,我有一个 class C,

@Entity
class C {

    //How to annotate this to enable search like setOfA.name="searchQuery", or setOfA.bObject.intValue=5
    @ElementCollection
    private Set<A> setOfA;
}

我知道我可以创建自定义 Bridge,但无法弄清楚 Bridge 应该做什么,特别是为了启用 setOfA.bObject.intValue = 5 这样的搜索。

感谢任何帮助。谢谢

在集合对象上使用 @ContainedIn,例如:

@ContainedIn
private Set<A> setOfA;

并在另一边使用 @IndexedEmbedded,例如:

@Embeddable
class A {
    @Field
    private String name;
    @Field
    private Boolean editable;
    @IndexedEmbedded
    private B bObject;

    @OneToOne( cascade = { CascadeType.PERSIST, CascadeType.REMOVE } )
    @IndexedEmbedded
    private C cObject; 
}

您需要添加 @OneToMany@ManyToMany 以便它是根据 JPA 的条款正确映射的关联。然后添加@IndexedEmbedded以通过Hibernate Search启用全文搜索。

这是一个工作示例:

@ElementCollection
@Field(name="listStringField")
@FieldBridge(impl=BuiltinIterableBridge.class)//ListStringBridge.class)
public List<String> getListString(){
    return listString;
}
  • @Field(name...) 定义一个可搜索字段。
  • @FieldBridge 允许搜索我的列表,但为此,您必须精确确定要使用的桥。这座桥将使该字段可索引。
  • BuiltinIterableBridge,此桥原生存在于 Hibernate Search 的包中。您所要做的就是使用它!
  • ListStringBridge。我创建的扩展 IterableBridge 的桥。你可以自己写。