如何解决休眠搜索-索引ManyToOne关系
我有两个索引实体
@Entity @Indexed
public class AEntity implements {
@Id
private String externalId;
@OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "externalId")
private Set<BEntity> bEntities;
}
@Entity @Indexed
public class BEntity {
@JsonIgnore @ManyToOne
@IndexedEmbedded(depth = 1)
@JoinColumn(name = "externalId",updatable = false)
private AEntity aEntity;
}
现在,当我像这样搜索BEntity时:
private QueryBuilder getQuery() {
FullTextEntityManager fullTextEntityManager = getFullTextEntityManager();
return fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(BEntity.class).get();
}
Query query = getQuery().bool()
.must(getQuery().keyword().onField("aEntity.externalId").matching(externalId).createQuery())
.createQuery();
我遇到以下错误:
在BEntity中找不到字段aEntity.externalId
解决方法
@IndexedEmbedded
默认不包含ID字段。
您对文档ID字段的操作有一些限制,所以我个人建议您定义一个与文档ID分开的实际字段。这样一来,您就可以放心地对其进行排序,标准化或其他任何操作:
@Entity @Indexed
public class AEntity implements {
@Id
@DocumentId(name = "docId") // CHANGE HERE
@Field // CHANGE HERE
private String externalId;
@OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "externalId")
private Set<BEntity> bEntities;
}
@Entity @Indexed
public class BEntity {
@JsonIgnore @ManyToOne
@IndexedEmbedded(depth = 1)
@JoinColumn(name = "externalId",updatable = false)
private AEntity aEntity;
}
但是,如果您确实要使用文档ID字段,则可以使用@IndexedEmbedded(includeEmbeddedObjectId = true)
:
@Entity @Indexed
public class AEntity implements {
@Id
private String externalId;
@OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "externalId")
private Set<BEntity> bEntities;
}
@Entity @Indexed
public class BEntity {
@JsonIgnore @ManyToOne
@IndexedEmbedded(depth = 1,includeEmbeddedObjectId = true) // CHANGE HERE
@JoinColumn(name = "externalId",updatable = false)
private AEntity aEntity;
}
别忘了在更改注释后重新索引数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。