休眠搜索@Indexed嵌入多态关系(@ Any,@ ManyToAny)

时间:2019-07-09 17:06:29

标签: spring hibernate search spring-data hibernate-search

我正在使用Hibernate Search,并希望索引具有使用@Any和/或@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 owner,Hibernate Search似乎没有为我索引这些字段。

如果我直接按预期对具体对象(用户或公司)使用@IndexedEmbedded,它将很好地工作。

1 个答案:

答案 0 :(得分:0)

是的,这是预期的。 @IndexedEmbedded仅为嵌入字段的公开类型添加字段。目前尚无修复的具体计划,但此处有一个功能要求:https://hibernate.atlassian.net/browse/HSEARCH-438 同样,接口不能映射用于索引,只有类可以。这将在搜索6中修复:https://hibernate.atlassian.net/browse/HSEARCH-1656

使代码工作的一种方法是将OwnerType变成一个抽象类,一个@MappedSuperclass或一个@Entity,然后移动在那里每个子类都通用的字段

编辑:如果用户/公司关联是互斥的(只有一个可以为非null),使它起作用的另一种方法是简单地查询两者。例如,查询字段owner.nameuser.name而不是查询company.name。休眠搜索DSL允许:仅使用.onFields("user.name", "company.name")而不是.onField("owner.name")