Hibernate Search - 搜索ManyToOne关系

时间:2017-04-26 17:39:32

标签: hibernate-search

我有两个索引实体。 播放器:

@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项目?

1 个答案:

答案 0 :(得分:3)

是的,也可以将ManyToOne关系编入索引。

在大多数情况下,您有一个实体,例如Club标记为@Indexed,然后您想要为其某些字段以及 embed 来自相关实体@IndexedEmbedded的{​​{1}}个属性。

到目前为止,你做得对,这基本上定义了Player索引的“扁平”架构。

问题在于,在为club索引定义架构时,您将player标记为索引字段,但未指示其将关系嵌入firstname。基本上你错过了这个属性的playersClub

不要与@IndexedEmbedded注释混淆:这​​纯粹是为了确保Hibernate Search会重新索引包含它的实体;它不会使双方以对称的方式相互嵌入。

在更正式的术语中,@ContainedIn建立的关系是有向图:如果您希望它遵循两个方向,则必须明确地建立它们。