我有两个索引实体。 播放器:
@Indexed
@Entity
public class Player {
@Field
private String firstName;
@ContainedIn
@ManyToOne
private Club playersClub;
}
和俱乐部:
@Indexed
@Entity
public class Club {
@Fields({
@Field(store=Store.COMPRESS),
@Field(name = "sorting_name", analyze = Analyze.NO)
})
private String name;
@IndexedEmbedded(depth = 1)
@OneToMany(mappedBy = "playersClub")
private Set<Player> players;
}
现在我在这里搜索ClubSearchService:
luceneQuery = queryBuilder
...
.onField("name").andField("players.firstName")
...
它工作正常,但当我想以其他方式搜索时(PlayerSearchService):
.onField("firstName").andField("lastName").andField("number").andField("country").andField("playersClub.name")
出现错误
org.hibernate.search.SearchException: Unable to find field playersClub.name in pl.domain.Player
Hibernate Search无法搜索到ManyToOne项目?
答案 0 :(得分:3)
是的,也可以将ManyToOne
关系编入索引。
在大多数情况下,您有一个实体,例如Club
标记为@Indexed
,然后您想要为其某些字段以及 embed 编制索引来自相关实体@IndexedEmbedded
的{{1}}个属性。
到目前为止,你做得对,这基本上定义了Player
索引的“扁平”架构。
问题在于,在为club
索引定义架构时,您将player
标记为索引字段,但未指示其将关系嵌入firstname
。基本上你错过了这个属性的playersClub
。
不要与@IndexedEmbedded
注释混淆:这纯粹是为了确保Hibernate Search会重新索引包含它的实体;它不会使双方以对称的方式相互嵌入。
在更正式的术语中,@ContainedIn
建立的关系是有向图:如果您希望它遵循两个方向,则必须明确地建立它们。