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.name
和 company.name
。 Hibernate Search DSL 允许:只需使用 .onFields("user.name", "company.name")
而不是 .onField("owner.name")
.
我正在使用 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.name
和 company.name
。 Hibernate Search DSL 允许:只需使用 .onFields("user.name", "company.name")
而不是 .onField("owner.name")
.