我有两个索引实体
@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
答案 0 :(得分:1)
@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;
}
别忘了在更改注释后重新索引数据。