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

时间:2016-03-04 00:41:20

标签: hibernate elasticsearch jpa-2.0 hibernate-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;
}

现在,我有一个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等搜索。

感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:2)

这是一个有效的例子:

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

答案 1 :(得分:0)

在集合对象上使用@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; 
}

答案 2 :(得分:0)

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