我正在使用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,它将很好地工作。
答案 0 :(得分:0)
是的,这是预期的。 @IndexedEmbedded
仅为嵌入字段的公开类型添加字段。目前尚无修复的具体计划,但此处有一个功能要求:https://hibernate.atlassian.net/browse/HSEARCH-438
同样,接口不能映射用于索引,只有类可以。这将在搜索6中修复:https://hibernate.atlassian.net/browse/HSEARCH-1656
使代码工作的一种方法是将OwnerType
变成一个抽象类,一个@MappedSuperclass
或一个@Entity
,然后移动在那里每个子类都通用的字段
编辑:如果用户/公司关联是互斥的(只有一个可以为非null),使它起作用的另一种方法是简单地查询两者。例如,查询字段owner.name
和user.name
而不是查询company.name
。休眠搜索DSL允许:仅使用.onFields("user.name", "company.name")
而不是.onField("owner.name")
。