在休眠搜索中对嵌入式实体名称进行排序

时间:2020-02-25 18:47:03

标签: hibernate-search

我有以下实体定义。

public class Order {
    @Id
    @DocumentId
    private Long id;

    @Field
    @IndexedEmbedded(includePaths = {"name"})
    @OneToOne
    @JoinColumn(name = "ACCOUNT_ID")
    private Account account;

    // the rest are omitted for brevity purpose
}

public class Account {
    @Id
    @DocumentId
    private Long id;

    @SortableField(forField = "name_Sort")
    @Field(name = "name_Sort", store = Store.YES, normalizer= @Normalizer(definition = SearchConstants.LOWER_CASE_NORMALIZER))
    @Column(name = "NAME")
    private String name;    
}

如果我在Order上搜索并希望按帐户名称对搜索结果进行排序,是否有可能使用嵌入的索引注释来实现?我知道我们可以通过在Order中添加一个名为accountName的额外字符串字段,然后在其顶部添加排序注释来做到这一点。是否可以不通过在Order中指定排序注释而仅使用Account中已经定义的排序注释来实现?

1 个答案:

答案 0 :(得分:1)

更改此:

    @IndexedEmbedded(includePaths = {"name"})

对此:

    @IndexedEmbedded(includePaths = {"name", "name_Sort"})

然后,您可以使用字段account.name_Sort进行订单排序:

QueryBuilder builder = fullTextSession.getSearchFactory()
    .buildQueryBuilder().forEntity( Order.class ).get();
Query luceneQuery = /* ... */;
FullTextQuery query = s.createFullTextQuery( luceneQuery, Order.class );
query.setSort(
    builder.sort().byField("account.name_Sort").createSort()
);
List results = query.list();