Hibernate Search @IndexedEmbedded 上的多态关系(@Any, @ManyToAny)

Hibernate Search @IndexedEmbedded on a polymorphic relationship (@Any, @ManyToAny)

我正在使用 Hibernate Search 并希望为具有使用 @Any and/or @ManyToAny.

的多态关系的对象编制索引
@Indexed
public class Foo {
    @Any(metaDef="fooOwnerType", metaColumn=@Column(name="ownerType"))
    @JoinColumn(name="ownerId")
    @IndexedEmbedded // this DOES NOT WORK
    private OwnerType owner;

    @OneToOne
    @IndexedEmbedded // this WORKS
    private User user;

    @OneToOne
    @IndexedEmbedded // this WORKS
    private Company company;

    @Field
    private String description;
}

@Indexed
public class User implements OwnerType {
    @Field
    private String name;

    @Field
    private String address;
}

public class Company implements OwnerType {
    @Field
    private String name;
}    

public interface OwnerType {
}

我可以毫无问题地使用描述字段中的文本搜索和查找 Foo 对象。我还想做的是在匹配 User.name 或 User.address 时找到 Foo 对象......但是由于多态关系 OwnerType 所有者,Hibernate Search 似乎没有为我索引这些字段。

如果我按预期直接在具体对象(用户或公司)上使用@IndexedEmbedded,效果会很好。

是的,这是意料之中的。 @IndexedEmbedded 仅为嵌入字段的公开类型添加字段。目前没有修复它的具体计划,但这里有一个功能请求:https://hibernate.atlassian.net/browse/HSEARCH-438 此外,不能为索引映射接口,只有 classes 可以。这将在搜索 6 中修复:https://hibernate.atlassian.net/browse/HSEARCH-1656

使您的代码工作的一种方法是将 OwnerType 转换为抽象 class,@MappedSuperclass@Entity,然后移动那里的每个子 class 都是通用的。

编辑:如果 user/company 关联是互斥的(只有一个可以是 non-null),另一种使其工作的方法是简单地查询两者。例如,不是查询 owner.name,而是查询字段 user.namecompany.name。 Hibernate Search DSL 允许:只需使用 .onFields("user.name", "company.name") 而不是 .onField("owner.name").